You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by gg...@apache.org on 2021/07/25 18:42:33 UTC

[commons-io] 01/04: [IO-744] FileWriterWithEncoding for an existing file no longer truncates the file. #251.

This is an automated email from the ASF dual-hosted git repository.

ggregory pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/commons-io.git

commit 89675b658065bb3460993e6995a3d1b88f08f545
Author: Gary Gregory <ga...@gmail.com>
AuthorDate: Sun Jul 25 14:36:11 2021 -0400

    [IO-744] FileWriterWithEncoding for an existing file no longer truncates
    the file. #251.
    
    This commit is a much simpler fix than PR 251. The test from the PR is
    the same, just reformatted.
---
 src/changes/changes.xml                            |  3 +
 .../commons/io/output/FileWriterWithEncoding.java  |  2 +-
 .../io/output/FileWriterWithEncodingTest.java      | 66 +++++++++++++---------
 3 files changed, 42 insertions(+), 29 deletions(-)

diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index 9066d5c..fdb38d4 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -50,6 +50,9 @@ The <action> type attribute can be add,update,fix,remove.
       <action dev="ggregory" type="fix" due-to="Gary Gregory">
         Fix Javadoc links to the JRE Javadoc 8.
       </action>
+      <action issue="IO-744" dev="ggregory" type="fix" due-to="RBRi, Gary Gregory">
+        FileWriterWithEncoding for an existing file no longer truncates the file. #251.
+      </action>
       <!-- ADD -->
       <action dev="ggregory" type="add" due-to="Gary Gregory">
         Add BrokenReader.INSTANCE.
diff --git a/src/main/java/org/apache/commons/io/output/FileWriterWithEncoding.java b/src/main/java/org/apache/commons/io/output/FileWriterWithEncoding.java
index ce8c207..d3b9d3b 100644
--- a/src/main/java/org/apache/commons/io/output/FileWriterWithEncoding.java
+++ b/src/main/java/org/apache/commons/io/output/FileWriterWithEncoding.java
@@ -227,7 +227,7 @@ public class FileWriterWithEncoding extends Writer {
         OutputStream stream = null;
         final boolean fileExistedAlready = file.exists();
         try {
-            stream = Files.newOutputStream(file.toPath(),  append ? StandardOpenOption.APPEND : StandardOpenOption.CREATE);
+            stream = Files.newOutputStream(file.toPath(),  append ? StandardOpenOption.APPEND : StandardOpenOption.CREATE, StandardOpenOption.TRUNCATE_EXISTING);
             if (encoding instanceof Charset) {
                 return new OutputStreamWriter(stream, (Charset)encoding);
             }
diff --git a/src/test/java/org/apache/commons/io/output/FileWriterWithEncodingTest.java b/src/test/java/org/apache/commons/io/output/FileWriterWithEncodingTest.java
index 3cb227b..60df3ba 100644
--- a/src/test/java/org/apache/commons/io/output/FileWriterWithEncodingTest.java
+++ b/src/test/java/org/apache/commons/io/output/FileWriterWithEncodingTest.java
@@ -18,6 +18,7 @@ package org.apache.commons.io.output;
 
 import static org.apache.commons.io.test.TestUtils.checkFile;
 import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertThrows;
 import static org.junit.jupiter.api.Assertions.assertTrue;
 import static org.junit.jupiter.api.Assertions.fail;
@@ -99,10 +100,8 @@ public class FileWriterWithEncodingTest {
     }
 
     private void successfulRun(final FileWriterWithEncoding fw21) throws Exception {
-        try (
-            FileWriter fw1 = new FileWriter(file1);  // default encoding
-            FileWriterWithEncoding fw2 = fw21
-        ){
+        try (FileWriter fw1 = new FileWriter(file1); // default encoding
+            FileWriterWithEncoding fw2 = fw21) {
             writeTestPayload(fw1, fw2);
             checkFile(file1, file2);
         }
@@ -113,10 +112,8 @@ public class FileWriterWithEncodingTest {
     @Test
     public void testDifferentEncoding() throws Exception {
         if (Charset.isSupported("UTF-16BE")) {
-            try (
-                FileWriter fw1 = new FileWriter(file1);  // default encoding
-                FileWriterWithEncoding fw2 = new FileWriterWithEncoding(file2, defaultEncoding)
-            ){
+            try (FileWriter fw1 = new FileWriter(file1); // default encoding
+                FileWriterWithEncoding fw2 = new FileWriterWithEncoding(file2, defaultEncoding)) {
                 writeTestPayload(fw1, fw2);
                 try {
                     checkFile(file1, file2);
@@ -130,10 +127,8 @@ public class FileWriterWithEncodingTest {
             assertTrue(file2.exists());
         }
         if (Charset.isSupported("UTF-16LE")) {
-            try (
-                FileWriter fw1 = new FileWriter(file1);  // default encoding
-                FileWriterWithEncoding fw2 = new FileWriterWithEncoding(file2, defaultEncoding)
-            ){
+            try (FileWriter fw1 = new FileWriter(file1); // default encoding
+                FileWriterWithEncoding fw2 = new FileWriterWithEncoding(file2, defaultEncoding)) {
                 writeTestPayload(fw1, fw2);
                 try {
                     checkFile(file1, file2);
@@ -170,40 +165,40 @@ public class FileWriterWithEncodingTest {
     @Test
     public void constructor_File_encoding_badEncoding() {
         assertThrows(IOException.class, () -> {
-            try (
-                Writer writer = new FileWriterWithEncoding(file1, "BAD-ENCODE")
-            ){ }
-         });
+            try (Writer writer = new FileWriterWithEncoding(file1, "BAD-ENCODE")) {
+                // empty
+            }
+        });
         assertFalse(file1.exists());
     }
 
     @Test
     public void constructor_File_directory() {
         assertThrows(IOException.class, () -> {
-            try (
-                Writer writer = new FileWriterWithEncoding(temporaryFolder, defaultEncoding)
-            ){ }
-         });
+            try (Writer writer = new FileWriterWithEncoding(temporaryFolder, defaultEncoding)) {
+                // empty
+            }
+        });
         assertFalse(file1.exists());
     }
 
     @Test
     public void constructor_File_nullFile() {
         assertThrows(NullPointerException.class, () -> {
-            try (
-                Writer writer = new FileWriterWithEncoding((File) null, defaultEncoding)
-            ){ }
-         });
+            try (Writer writer = new FileWriterWithEncoding((File) null, defaultEncoding)) {
+                // empty
+            }
+        });
         assertFalse(file1.exists());
     }
 
     @Test
     public void constructor_fileName_nullFile() {
         assertThrows(NullPointerException.class, () -> {
-            try (
-                Writer writer = new FileWriterWithEncoding((String) null, defaultEncoding)
-            ){ }
-         });
+            try (Writer writer = new FileWriterWithEncoding((String) null, defaultEncoding)) {
+                // empty
+            }
+        });
         assertFalse(file1.exists());
     }
 
@@ -213,7 +208,22 @@ public class FileWriterWithEncodingTest {
             successfulRun(new FileWriterWithEncoding(file2, (Charset) null));
             fail();
         } catch (final NullPointerException ignore) {
+            // empty
+        }
+    }
 
+    @Test
+    public void constructor_File_existingFile_withContent() throws Exception {
+        try (FileWriter fw1 = new FileWriter(file1);) {
+            fw1.write(textContent);
+            fw1.write(65);
         }
+        assertEquals(1025, file1.length());
+
+        try (FileWriterWithEncoding fw1 = new FileWriterWithEncoding(file1, defaultEncoding)) {
+            fw1.write("ABcd");
+        }
+
+        assertEquals(4, file1.length());
     }
 }