You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@groovy.apache.org by "Keegan Witt (JIRA)" <ji...@apache.org> on 2015/06/11 15:19:00 UTC

[jira] [Created] (GROOVY-7465) ResourceGroovyMethods/NioGroovyMethods BOM behavior is inconsistant

Keegan Witt created GROOVY-7465:
-----------------------------------

             Summary: ResourceGroovyMethods/NioGroovyMethods BOM behavior is inconsistant
                 Key: GROOVY-7465
                 URL: https://issues.apache.org/jira/browse/GROOVY-7465
             Project: Groovy
          Issue Type: Bug
          Components: groovy-jdk
            Reporter: Keegan Witt
            Assignee: Guillaume Laforge


Most users would expect {{withPrintWriter}} to be a convenience method that behaves the same as if they had called {{new PrintWriter}} themselves, but this is not the current behavior:

{code:java}
File file = new File("tmp.txt")
try {
    String text = " "
    String charset = "UTF-16LE"

    file.withPrintWriter(charset) { it << text }
    println "withPrintWriter"
    file.getBytes().each { System.out.format("%02x ", it) }

    PrintWriter w = new PrintWriter(file, charset)
    w.print(text)
    w.close()
    println "\n\nnew PrintWriter"
    file.getBytes().each { System.out.format("%02x ", it) }
} finally {
    file.delete()
}
{code}

Outputs
{noformat}
withPrintWriter
ff fe 20 00 

new PrintWriter
20 00
{noformat}

Additionally most users would expect that there's no difference in behavior between NIO and traditional methods, but this is also not the case

{code:java}
import java.nio.file.Files
import java.nio.file.FileSystems
import java.nio.file.Path

File file = new File("tmp1.txt")
Path path = FileSystems.getDefault().getPath("tmp2.txt")
try {
    String text = " "
    String charset = "UTF-16LE"

    file.withPrintWriter(charset) { it << text }
    println "withPrintWriter"
    file.getBytes().each { System.out.format("%02x ", it) }

    path.withPrintWriter(charset) { it << text }
    println "\n\nnio withPrintWriter"
    path.getBytes().each { System.out.format("%02x ", it) }
} finally {
    file.delete()
    Files.delete(path)
}
{code}

outputs
{noformat}
withPrintWriter
ff fe 20 00

nio withPrintWriter
20 00
{noformat}

This is because {{ResourceGroovyMethods}} have a {{writeUTF16BomIfRequired}} method that {{NioGroovyMethods}} don't.

Most likely we'd want to change {{ResourceGroovyMethods}} to not add the BOM by default, or at least allow the user to opt out of that behavior by doing something like adding a boolean argument to the existing methods that would control that behavior.  The other option would be to make the NIO methods consistent by having them also use {{writeUTF16BomIfRequired}}.

This began as a [discussion|http://mail-archives.apache.org/mod_mbox/incubator-groovy-users/201506.mbox/browser] on the user mailing list.



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)