[ 
https://issues.apache.org/jira/browse/GROOVY-7465?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14995551#comment-14995551
 ] 

ASF GitHub Bot commented on GROOVY-7465:
----------------------------------------

Github user PascalSchumacher commented on a diff in the pull request:

    https://github.com/apache/incubator-groovy/pull/176#discussion_r44221781
  
    --- Diff: src/main/org/codehaus/groovy/runtime/ResourceGroovyMethods.java 
---
    @@ -831,9 +836,8 @@ public static File leftShift(File file, InputStream 
data) throws IOException {
         }
     
         /**
    -     * Write the text to the File, using the specified encoding.  If the 
given
    -     * charset is "UTF-16BE" or "UTF-16LE" (or an equivalent alias), the
    -     * requisite byte order mark is written to the file before the text.
    +     * Write the text without a BOM to the File without writing a BOM, 
using
    --- End diff --
    
    This sentence seems a bit confusing to me.


> ResourceGroovyMethods/NioGroovyMethods BOM behavior is inconsistent
> -------------------------------------------------------------------
>
>                 Key: GROOVY-7465
>                 URL: https://issues.apache.org/jira/browse/GROOVY-7465
>             Project: Groovy
>          Issue Type: Bug
>          Components: groovy-jdk
>            Reporter: Keegan Witt
>            Assignee: Keegan Witt
>              Labels: breaking_change
>             Fix For: 2.5.0-beta-1
>
>
> 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)

Reply via email to