From 2c554ac916d500b4aad320550c0b9379d180cbed Mon Sep 17 00:00:00 2001 From: Elliotte Rusty Harold Date: Sat, 7 Oct 2023 09:00:15 -0400 Subject: [PATCH 1/6] don't write a BOM on every (or any) line --- src/main/java/org/apache/commons/io/IOUtils.java | 7 ++++++- src/test/java/org/apache/commons/io/IOUtilsTest.java | 10 ++++++++++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/apache/commons/io/IOUtils.java b/src/main/java/org/apache/commons/io/IOUtils.java index 6d1ebe7eb43..280251a12af 100644 --- a/src/main/java/org/apache/commons/io/IOUtils.java +++ b/src/main/java/org/apache/commons/io/IOUtils.java @@ -45,6 +45,7 @@ import java.nio.channels.ReadableByteChannel; import java.nio.channels.Selector; import java.nio.charset.Charset; +import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.util.Arrays; import java.util.Collection; @@ -3844,7 +3845,11 @@ public static void writeLines(final Collection lines, String lineEnding, fina if (lineEnding == null) { lineEnding = System.lineSeparator(); } - final Charset cs = Charsets.toCharset(charset); + Charset cs = Charsets.toCharset(charset); + // don't write a BOM + if (cs == StandardCharsets.UTF_16) { + cs = StandardCharsets.UTF_16BE; + } final byte[] eolBytes = lineEnding.getBytes(cs); for (final Object line : lines) { if (line != null) { diff --git a/src/test/java/org/apache/commons/io/IOUtilsTest.java b/src/test/java/org/apache/commons/io/IOUtilsTest.java index e361e88571c..597da0ccf25 100644 --- a/src/test/java/org/apache/commons/io/IOUtilsTest.java +++ b/src/test/java/org/apache/commons/io/IOUtilsTest.java @@ -1761,4 +1761,14 @@ public void testWriteLittleString() throws IOException { } } + @Test + public void testWriteLines() throws IOException { + String[] data = {"The", "quick"}; + ByteArrayOutputStream out = new ByteArrayOutputStream(); + IOUtils.writeLines(Arrays.asList(data), "\n", out, "UTF-16"); + String result = new String(out.toByteArray(), StandardCharsets.UTF_16); + assertEquals("The\nquick\n", result); + } + + } From c19b6af7379e000898de7c119694982d2c88bb93 Mon Sep 17 00:00:00 2001 From: Elliotte Rusty Harold Date: Sat, 7 Oct 2023 09:01:05 -0400 Subject: [PATCH 2/6] detab --- src/main/java/org/apache/commons/io/IOUtils.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/apache/commons/io/IOUtils.java b/src/main/java/org/apache/commons/io/IOUtils.java index 280251a12af..972875673e9 100644 --- a/src/main/java/org/apache/commons/io/IOUtils.java +++ b/src/main/java/org/apache/commons/io/IOUtils.java @@ -3848,7 +3848,7 @@ public static void writeLines(final Collection lines, String lineEnding, fina Charset cs = Charsets.toCharset(charset); // don't write a BOM if (cs == StandardCharsets.UTF_16) { - cs = StandardCharsets.UTF_16BE; + cs = StandardCharsets.UTF_16BE; } final byte[] eolBytes = lineEnding.getBytes(cs); for (final Object line : lines) { From 208f7f478448eadf3754fc1612ac0b6703742350 Mon Sep 17 00:00:00 2001 From: Elliotte Rusty Harold Date: Sat, 7 Oct 2023 09:05:30 -0400 Subject: [PATCH 3/6] don't write a BOM on every (or any) line --- src/main/java/org/apache/commons/io/IOUtils.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/apache/commons/io/IOUtils.java b/src/main/java/org/apache/commons/io/IOUtils.java index 972875673e9..2d04a09ccad 100644 --- a/src/main/java/org/apache/commons/io/IOUtils.java +++ b/src/main/java/org/apache/commons/io/IOUtils.java @@ -3828,12 +3828,16 @@ public static void writeLines(final Collection lines, final String lineEnding * Writes the {@link #toString()} value of each item in a collection to * an {@link OutputStream} line by line, using the specified character * encoding and the specified line ending. + * + * UTF-16 is written big-endian with no byte order mark. + * For little endian, use UTF-16LE. For a BOM, write it to the stream + * before calling this method. * * @param lines the lines to write, null entries produce blank lines * @param lineEnding the line separator to use, null is system default * @param output the {@link OutputStream} to write to, not null, not closed * @param charset the charset to use, null means platform default - * @throws NullPointerException if the output is null + * @throws NullPointerException if output is null * @throws IOException if an I/O error occurs * @since 2.3 */ From adb2f49ce90db3ea3402559ed64bfee86aa8cbf9 Mon Sep 17 00:00:00 2001 From: Elliotte Rusty Harold Date: Sat, 7 Oct 2023 09:31:07 -0400 Subject: [PATCH 4/6] whitespace --- src/test/java/org/apache/commons/io/IOUtilsTest.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/test/java/org/apache/commons/io/IOUtilsTest.java b/src/test/java/org/apache/commons/io/IOUtilsTest.java index 597da0ccf25..670f9716a80 100644 --- a/src/test/java/org/apache/commons/io/IOUtilsTest.java +++ b/src/test/java/org/apache/commons/io/IOUtilsTest.java @@ -1768,7 +1768,6 @@ public void testWriteLines() throws IOException { IOUtils.writeLines(Arrays.asList(data), "\n", out, "UTF-16"); String result = new String(out.toByteArray(), StandardCharsets.UTF_16); assertEquals("The\nquick\n", result); - } - + } } From cd5399224517a9185ddae033b27b2f399c46f720 Mon Sep 17 00:00:00 2001 From: Elliotte Rusty Harold Date: Sat, 7 Oct 2023 09:48:01 -0400 Subject: [PATCH 5/6] checkstyle --- src/main/java/org/apache/commons/io/IOUtils.java | 2 +- src/test/java/org/apache/commons/io/IOUtilsTest.java | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/org/apache/commons/io/IOUtils.java b/src/main/java/org/apache/commons/io/IOUtils.java index 2d04a09ccad..3382e865eba 100644 --- a/src/main/java/org/apache/commons/io/IOUtils.java +++ b/src/main/java/org/apache/commons/io/IOUtils.java @@ -3828,7 +3828,7 @@ public static void writeLines(final Collection lines, final String lineEnding * Writes the {@link #toString()} value of each item in a collection to * an {@link OutputStream} line by line, using the specified character * encoding and the specified line ending. - * + * * UTF-16 is written big-endian with no byte order mark. * For little endian, use UTF-16LE. For a BOM, write it to the stream * before calling this method. diff --git a/src/test/java/org/apache/commons/io/IOUtilsTest.java b/src/test/java/org/apache/commons/io/IOUtilsTest.java index 670f9716a80..5e9d2a6c724 100644 --- a/src/test/java/org/apache/commons/io/IOUtilsTest.java +++ b/src/test/java/org/apache/commons/io/IOUtilsTest.java @@ -1763,10 +1763,10 @@ public void testWriteLittleString() throws IOException { @Test public void testWriteLines() throws IOException { - String[] data = {"The", "quick"}; - ByteArrayOutputStream out = new ByteArrayOutputStream(); + final String[] data = {"The", "quick"}; + final ByteArrayOutputStream out = new ByteArrayOutputStream(); IOUtils.writeLines(Arrays.asList(data), "\n", out, "UTF-16"); - String result = new String(out.toByteArray(), StandardCharsets.UTF_16); + final String result = new String(out.toByteArray(), StandardCharsets.UTF_16); assertEquals("The\nquick\n", result); } From 25c4e693244f82a33dfde2b759bf4f237ba90e1d Mon Sep 17 00:00:00 2001 From: Gary Gregory Date: Sat, 7 Oct 2023 10:16:50 -0400 Subject: [PATCH 6/6] Remove trailing whitespace --- src/test/java/org/apache/commons/io/IOUtilsTest.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/test/java/org/apache/commons/io/IOUtilsTest.java b/src/test/java/org/apache/commons/io/IOUtilsTest.java index 5e9d2a6c724..0a3e7d39499 100644 --- a/src/test/java/org/apache/commons/io/IOUtilsTest.java +++ b/src/test/java/org/apache/commons/io/IOUtilsTest.java @@ -1768,6 +1768,6 @@ public void testWriteLines() throws IOException { IOUtils.writeLines(Arrays.asList(data), "\n", out, "UTF-16"); final String result = new String(out.toByteArray(), StandardCharsets.UTF_16); assertEquals("The\nquick\n", result); - } - + } + }