Author: niallp
Date: Sat Mar 12 22:12:33 2011
New Revision: 1081011

URL: http://svn.apache.org/viewvc?rev=1081011&view=rev
Log:
IO-182 Add new "append" parameter to methods writing to files - thanks to 
Benoit Lafontaine for the patch

Modified:
    commons/proper/io/trunk/src/main/java/org/apache/commons/io/FileUtils.java
    
commons/proper/io/trunk/src/test/java/org/apache/commons/io/FileUtilsTestCase.java

Modified: 
commons/proper/io/trunk/src/main/java/org/apache/commons/io/FileUtils.java
URL: 
http://svn.apache.org/viewvc/commons/proper/io/trunk/src/main/java/org/apache/commons/io/FileUtils.java?rev=1081011&r1=1081010&r2=1081011&view=diff
==============================================================================
--- commons/proper/io/trunk/src/main/java/org/apache/commons/io/FileUtils.java 
(original)
+++ commons/proper/io/trunk/src/main/java/org/apache/commons/io/FileUtils.java 
Sat Mar 12 22:12:33 2011
@@ -220,6 +220,32 @@ public class FileUtils {
      * @since Commons IO 1.3
      */
     public static FileOutputStream openOutputStream(File file) throws 
IOException {
+        return openOutputStream(file, false);
+    }
+
+    /**
+     * Opens a {@link FileOutputStream} for the specified file, checking and
+     * creating the parent directory if it does not exist.
+     * <p>
+     * At the end of the method either the stream will be successfully opened,
+     * or an exception will have been thrown.
+     * <p>
+     * The parent directory will be created if it does not exist.
+     * The file will be created if it does not exist.
+     * An exception is thrown if the file object exists but is a directory.
+     * An exception is thrown if the file exists but cannot be written to.
+     * An exception is thrown if the parent directory cannot be created.
+     * 
+     * @param file  the file to open for output, must not be <code>null</code>
+     * @param append if <code>true</code>, then bytes will be added to the
+     * end of the file rather than overwriting
+     * @return a new {@link FileOutputStream} for the specified file
+     * @throws IOException if the file object is a directory
+     * @throws IOException if the file cannot be written to
+     * @throws IOException if a parent directory needs creating but that fails
+     * @since Commons IO 2.1
+     */
+    public static FileOutputStream openOutputStream(File file, boolean append) 
throws IOException {
         if (file.exists()) {
             if (file.isDirectory()) {
                 throw new IOException("File '" + file + "' exists but is a 
directory");
@@ -235,7 +261,7 @@ public class FileUtils {
                 }
             }
         }
-        return new FileOutputStream(file);
+        return new FileOutputStream(file, append);
     }
 
     //-----------------------------------------------------------------------
@@ -1469,9 +1495,25 @@ public class FileUtils {
      * @throws java.io.UnsupportedEncodingException if the encoding is not 
supported by the VM
      */
     public static void writeStringToFile(File file, String data, String 
encoding) throws IOException {
+        writeStringToFile(file, data, encoding, false);
+    }
+
+    /**
+     * Writes a String to a file creating the file if it does not exist.
+     *
+     * @param file  the file to write
+     * @param data  the content to write to the file
+     * @param encoding  the encoding to use, <code>null</code> means platform 
default
+     * @param append if <code>true</code>, then the String will be added to the
+     * end of the file rather than overwriting
+     * @throws IOException in case of an I/O error
+     * @throws java.io.UnsupportedEncodingException if the encoding is not 
supported by the VM
+     * @since Commons IO 2.1
+     */
+    public static void writeStringToFile(File file, String data, String 
encoding, boolean append) throws IOException {
         OutputStream out = null;
         try {
-            out = openOutputStream(file);
+            out = openOutputStream(file, append);
             IOUtils.write(data, out, encoding);
         } finally {
             IOUtils.closeQuietly(out);
@@ -1486,7 +1528,21 @@ public class FileUtils {
      * @throws IOException in case of an I/O error
      */
     public static void writeStringToFile(File file, String data) throws 
IOException {
-        writeStringToFile(file, data, null);
+        writeStringToFile(file, data, null, false);
+    }
+
+    /**
+     * Writes a String to a file creating the file if it does not exist using 
the default encoding for the VM.
+     * 
+     * @param file  the file to write
+     * @param data  the content to write to the file
+     * @param append if <code>true</code>, then the String will be added to the
+     * end of the file rather than overwriting
+     * @throws IOException in case of an I/O error
+     * @since Commons IO 2.1
+     */
+    public static void writeStringToFile(File file, String data, boolean 
append) throws IOException {
+        writeStringToFile(file, data, null, append);
     }
 
     /**
@@ -1498,8 +1554,21 @@ public class FileUtils {
      * @since Commons IO 2.0
      */
     public static void write(File file, CharSequence data) throws IOException {
-        String str = data == null ? null : data.toString();
-        writeStringToFile(file, str);
+        write(file, data, null, false);
+    }
+
+    /**
+     * Writes a CharSequence to a file creating the file if it does not exist 
using the default encoding for the VM.
+     * 
+     * @param file  the file to write
+     * @param data  the content to write to the file
+     * @param append if <code>true</code>, then the data will be added to the
+     * end of the file rather than overwriting
+     * @throws IOException in case of an I/O error
+     * @since Commons IO 2.1
+     */
+    public static void write(File file, CharSequence data, boolean append) 
throws IOException {
+        write(file, data, null, append);
     }
 
     /**
@@ -1513,8 +1582,24 @@ public class FileUtils {
      * @since Commons IO 2.0
      */
     public static void write(File file, CharSequence data, String encoding) 
throws IOException {
+        write(file, data, encoding, false);
+    }
+
+    /**
+     * Writes a CharSequence to a file creating the file if it does not exist.
+     *
+     * @param file  the file to write
+     * @param data  the content to write to the file
+     * @param encoding  the encoding to use, <code>null</code> means platform 
default
+     * @param append if <code>true</code>, then the data will be added to the
+     * end of the file rather than overwriting
+     * @throws IOException in case of an I/O error
+     * @throws java.io.UnsupportedEncodingException if the encoding is not 
supported by the VM
+     * @since IO 2.1
+     */
+    public static void write(File file, CharSequence data, String encoding, 
boolean append) throws IOException {
         String str = data == null ? null : data.toString();
-        writeStringToFile(file, str, encoding);
+        writeStringToFile(file, str, encoding, append);
     }
 
     /**
@@ -1529,9 +1614,23 @@ public class FileUtils {
      * @since Commons IO 1.1
      */
     public static void writeByteArrayToFile(File file, byte[] data) throws 
IOException {
+        writeByteArrayToFile(file, data, false);
+    }
+
+    /**
+     * Writes a byte array to a file creating the file if it does not exist.
+     *
+     * @param file  the file to write to
+     * @param data  the content to write to the file
+     * @param append if <code>true</code>, then bytes will be added to the
+     * end of the file rather than overwriting
+     * @throws IOException in case of an I/O error
+     * @since IO 2.1
+     */
+    public static void writeByteArrayToFile(File file, byte[] data, boolean 
append) throws IOException {
         OutputStream out = null;
         try {
-            out = openOutputStream(file);
+            out = openOutputStream(file, append);
             out.write(data);
         } finally {
             IOUtils.closeQuietly(out);
@@ -1554,7 +1653,25 @@ public class FileUtils {
      * @since Commons IO 1.1
      */
     public static void writeLines(File file, String encoding, Collection<?> 
lines) throws IOException {
-        writeLines(file, encoding, lines, null);
+        writeLines(file, encoding, lines, null, false);
+    }
+
+    /**
+     * Writes the <code>toString()</code> value of each item in a collection to
+     * the specified <code>File</code> line by line, optionally appending.
+     * The specified character encoding and the default line ending will be 
used.
+     *
+     * @param file  the file to write to
+     * @param encoding  the encoding to use, <code>null</code> means platform 
default
+     * @param lines  the lines to write, <code>null</code> entries produce 
blank lines
+     * @param append if <code>true</code>, then the lines will be added to the
+     * end of the file rather than overwriting
+     * @throws IOException in case of an I/O error
+     * @throws java.io.UnsupportedEncodingException if the encoding is not 
supported by the VM
+     * @since Commons IO 2.1
+     */
+    public static void writeLines(File file, String encoding, Collection<?> 
lines, boolean append) throws IOException {
+        writeLines(file, encoding, lines, null, append);
     }
 
     /**
@@ -1568,7 +1685,23 @@ public class FileUtils {
      * @since Commons IO 1.3
      */
     public static void writeLines(File file, Collection<?> lines) throws 
IOException {
-        writeLines(file, null, lines, null);
+        writeLines(file, null, lines, null, false);
+    }
+    
+    /**
+     * Writes the <code>toString()</code> value of each item in a collection to
+     * the specified <code>File</code> line by line.
+     * The default VM encoding and the default line ending will be used.
+     *
+     * @param file  the file to write to
+     * @param lines  the lines to write, <code>null</code> entries produce 
blank lines
+     * @param append if <code>true</code>, then the lines will be added to the
+     * end of the file rather than overwriting
+     * @throws IOException in case of an I/O error
+     * @since Commons IO 2.1
+     */
+    public static void writeLines(File file, Collection<?> lines, boolean 
append) throws IOException {
+        writeLines(file, null, lines, null, append);
     }
 
     /**
@@ -1589,9 +1722,29 @@ public class FileUtils {
      */
     public static void writeLines(File file, String encoding, Collection<?> 
lines, String lineEnding)
         throws IOException {
+        writeLines(file, encoding, lines, lineEnding, false);
+    }
+
+    /**
+     * Writes the <code>toString()</code> value of each item in a collection to
+     * the specified <code>File</code> line by line.
+     * The specified character encoding and the line ending will be used.
+     *
+     * @param file  the file to write to
+     * @param encoding  the encoding to use, <code>null</code> means platform 
default
+     * @param lines  the lines to write, <code>null</code> entries produce 
blank lines
+     * @param lineEnding  the line separator to use, <code>null</code> is 
system default
+     * @param append if <code>true</code>, then the lines will be added to the
+     * end of the file rather than overwriting
+     * @throws IOException in case of an I/O error
+     * @throws java.io.UnsupportedEncodingException if the encoding is not 
supported by the VM
+     * @since Commons IO 2.1
+     */
+    public static void writeLines(File file, String encoding, Collection<?> 
lines, String lineEnding, boolean append)
+        throws IOException {
         OutputStream out = null;
         try {
-            out = openOutputStream(file);
+            out = openOutputStream(file, append);
             IOUtils.writeLines(lines, lineEnding, out, encoding);
         } finally {
             IOUtils.closeQuietly(out);
@@ -1610,7 +1763,25 @@ public class FileUtils {
      * @since Commons IO 1.3
      */
     public static void writeLines(File file, Collection<?> lines, String 
lineEnding) throws IOException {
-        writeLines(file, null, lines, lineEnding);
+        writeLines(file, null, lines, lineEnding, false);
+    }
+
+    /**
+     * Writes the <code>toString()</code> value of each item in a collection to
+     * the specified <code>File</code> line by line.
+     * The default VM encoding and the specified line ending will be used.
+     *
+     * @param file  the file to write to
+     * @param lines  the lines to write, <code>null</code> entries produce 
blank lines
+     * @param lineEnding  the line separator to use, <code>null</code> is 
system default
+     * @param append if <code>true</code>, then the lines will be added to the
+     * end of the file rather than overwriting
+     * @throws IOException in case of an I/O error
+     * @since Commons IO 2.1
+     */
+    public static void writeLines(File file, Collection<?> lines, String 
lineEnding, boolean append)
+        throws IOException {
+        writeLines(file, null, lines, lineEnding, append);
     }
 
     //-----------------------------------------------------------------------

Modified: 
commons/proper/io/trunk/src/test/java/org/apache/commons/io/FileUtilsTestCase.java
URL: 
http://svn.apache.org/viewvc/commons/proper/io/trunk/src/test/java/org/apache/commons/io/FileUtilsTestCase.java?rev=1081011&r1=1081010&r2=1081011&view=diff
==============================================================================
--- 
commons/proper/io/trunk/src/test/java/org/apache/commons/io/FileUtilsTestCase.java
 (original)
+++ 
commons/proper/io/trunk/src/test/java/org/apache/commons/io/FileUtilsTestCase.java
 Sat Mar 12 22:12:33 2011
@@ -1404,7 +1404,247 @@ public class FileUtilsTestCase extends F
         String actual = FileUtils.readFileToString(file, "US-ASCII");
         assertEquals(expected, actual);
     }
+    
+    public void 
testWriteLines_5argsWithAppendOptionTrue_ShouldNotDeletePreviousFileLines() 
throws Exception {
+        File file = newFile("lines.txt");
+        FileUtils.writeStringToFile(file, "This line was there before you...");
+        
+        List<String> linesToAppend = Arrays.asList(new String[] {
+                "my first line", "The second Line" });
+        FileUtils.writeLines(file, null, linesToAppend, null, true);
+
+        String expected = "This line was there before you..."
+                + "my first line"
+                + IOUtils.LINE_SEPARATOR + "The second Line"
+                + IOUtils.LINE_SEPARATOR ;
+        String actual = FileUtils.readFileToString(file);
+        assertEquals(expected, actual);
+    }
+
+    public void 
testWriteLines_5argsWithAppendOptionFalse_ShouldDeletePreviousFileLines() 
throws Exception {
+        File file = newFile("lines.txt");
+        FileUtils.writeStringToFile(file, "This line was there before you...");
+        
+        List<String> linesToAppend = Arrays.asList(new String[] {
+                "my first line", "The second Line" });
+        FileUtils.writeLines(file, null, linesToAppend, null, false);
+
+        String expected = "my first line"
+                + IOUtils.LINE_SEPARATOR + "The second Line"
+                + IOUtils.LINE_SEPARATOR ;
+        String actual = FileUtils.readFileToString(file);
+        assertEquals(expected, actual);
+    }
+
+    public void 
testWriteLines_4argsWithAppendOptionTrue_ShouldNotDeletePreviousFileLines() 
throws Exception {
+        File file = newFile("lines.txt");
+        FileUtils.writeStringToFile(file, "This line was there before you...");
+        
+        List<String> linesToAppend = Arrays.asList(new String[] {
+                "my first line", "The second Line" });
+        FileUtils.writeLines(file, linesToAppend, null, true);
+
+        String expected = "This line was there before you..."
+                + "my first line"
+                + IOUtils.LINE_SEPARATOR + "The second Line"
+                + IOUtils.LINE_SEPARATOR ;
+        String actual = FileUtils.readFileToString(file);
+        assertEquals(expected, actual);
+    }
+    
+    public void 
testWriteLines_4argsWithAppendOptionFalse_ShouldDeletePreviousFileLines() 
throws Exception {
+        File file = newFile("lines.txt");
+        FileUtils.writeStringToFile(file, "This line was there before you...");
+        
+        List<String> linesToAppend = Arrays.asList(new String[] {
+                "my first line", "The second Line" });
+        FileUtils.writeLines(file, linesToAppend, null, false);
+
+        String expected = "my first line"
+                + IOUtils.LINE_SEPARATOR + "The second Line"
+                + IOUtils.LINE_SEPARATOR ;
+        String actual = FileUtils.readFileToString(file);
+        assertEquals(expected, actual);
+    }
+
+
+    public void 
testWriteLinesEncoding_WithAppendOptionTrue_ShouldNotDeletePreviousFileLines() 
throws Exception {
+        File file = newFile("lines.txt");
+        FileUtils.writeStringToFile(file, "This line was there before you...");
+        
+        List<String> linesToAppend = Arrays.asList(new String[] {
+                "my first line", "The second Line" });
+        FileUtils.writeLines(file, null, linesToAppend, true);
+
+        String expected = "This line was there before you..."
+                + "my first line"
+                + IOUtils.LINE_SEPARATOR + "The second Line"
+                + IOUtils.LINE_SEPARATOR ;
+        String actual = FileUtils.readFileToString(file);
+        assertEquals(expected, actual);
+    }
+    
+    public void 
testWriteLinesEncoding_WithAppendOptionFalse_ShouldDeletePreviousFileLines() 
throws Exception {
+        File file = newFile("lines.txt");
+        FileUtils.writeStringToFile(file, "This line was there before you...");
+        
+        List<String> linesToAppend = Arrays.asList(new String[] {
+                "my first line", "The second Line" });
+        FileUtils.writeLines(file, null, linesToAppend, false);
+
+        String expected = "my first line"
+                + IOUtils.LINE_SEPARATOR + "The second Line"
+                + IOUtils.LINE_SEPARATOR ;
+        String actual = FileUtils.readFileToString(file);
+        assertEquals(expected, actual);
+    }
+    
+    public void 
testWriteLines_3argsWithAppendOptionTrue_ShouldNotDeletePreviousFileLines() 
throws Exception {
+        File file = newFile("lines.txt");
+        FileUtils.writeStringToFile(file, "This line was there before you...");
+        
+        List<String> linesToAppend = Arrays.asList(new String[] {
+                "my first line", "The second Line" });
+        FileUtils.writeLines(file, linesToAppend, true);
+
+        String expected = "This line was there before you..."
+                + "my first line"
+                + IOUtils.LINE_SEPARATOR + "The second Line"
+                + IOUtils.LINE_SEPARATOR ;
+        String actual = FileUtils.readFileToString(file);
+        assertEquals(expected, actual);
+    }
+    
+    public void 
testWriteLines_3argsWithAppendOptionFalse_ShouldDeletePreviousFileLines() 
throws Exception {
+        File file = newFile("lines.txt");
+        FileUtils.writeStringToFile(file, "This line was there before you...");
+        
+        List<String> linesToAppend = Arrays.asList(new String[] {
+                "my first line", "The second Line" });
+        FileUtils.writeLines(file, linesToAppend, false);
+
+        String expected = "my first line"
+                + IOUtils.LINE_SEPARATOR + "The second Line"
+                + IOUtils.LINE_SEPARATOR ;
+        String actual = FileUtils.readFileToString(file);
+        assertEquals(expected, actual);
+    }
+
+    public void 
testWriteStringToFileWithEncoding_WithAppendOptionTrue_ShouldNotDeletePreviousFileLines()
 throws Exception {
+        File file = newFile("lines.txt");
+        FileUtils.writeStringToFile(file, "This line was there before you...");
+        
+        FileUtils.writeStringToFile(file, "this is brand new data", null, 
true);
+
+        String expected = "This line was there before you..."
+                + "this is brand new data";
+        String actual = FileUtils.readFileToString(file);
+        assertEquals(expected, actual);
+    }
+
+    public void 
testWriteStringToFileWithEncoding_WithAppendOptionFalse_ShouldDeletePreviousFileLines()
 throws Exception {
+        File file = newFile("lines.txt");
+        FileUtils.writeStringToFile(file, "This line was there before you...");
+        
+        FileUtils.writeStringToFile(file, "this is brand new data", null, 
false);
+
+        String expected = "this is brand new data";
+        String actual = FileUtils.readFileToString(file);
+        assertEquals(expected, actual);
+    }
+
+    public void 
testWriteStringToFile_WithAppendOptionTrue_ShouldNotDeletePreviousFileLines() 
throws Exception {
+        File file = newFile("lines.txt");
+        FileUtils.writeStringToFile(file, "This line was there before you...");
+        
+        FileUtils.writeStringToFile(file, "this is brand new data", true);
+
+        String expected = "This line was there before you..."
+                + "this is brand new data";
+        String actual = FileUtils.readFileToString(file);
+        assertEquals(expected, actual);
+    }
+
+    public void 
testWriteStringToFile_WithAppendOptionFalse_ShouldDeletePreviousFileLines() 
throws Exception {
+        File file = newFile("lines.txt");
+        FileUtils.writeStringToFile(file, "This line was there before you...");
+        
+        FileUtils.writeStringToFile(file, "this is brand new data", false);
+
+        String expected = "this is brand new data";
+        String actual = FileUtils.readFileToString(file);
+        assertEquals(expected, actual);
+    }
 
+    public void 
testWriteWithEncoding_WithAppendOptionTrue_ShouldNotDeletePreviousFileLines() 
throws Exception {
+        File file = newFile("lines.txt");
+        FileUtils.writeStringToFile(file, "This line was there before you...");
+        
+        FileUtils.write(file, "this is brand new data", null, true);
+
+        String expected = "This line was there before you..."
+            + "this is brand new data";
+        String actual = FileUtils.readFileToString(file);
+        assertEquals(expected, actual);
+    }
+    
+    public void 
testWriteWithEncoding_WithAppendOptionFalse_ShouldDeletePreviousFileLines() 
throws Exception {
+        File file = newFile("lines.txt");
+        FileUtils.writeStringToFile(file, "This line was there before you...");
+        
+        FileUtils.write(file, "this is brand new data", null, false);
+
+        String expected = "this is brand new data";
+        String actual = FileUtils.readFileToString(file);
+        assertEquals(expected, actual);
+    }
+    
+    public void 
testWrite_WithAppendOptionTrue_ShouldNotDeletePreviousFileLines() throws 
Exception {
+        File file = newFile("lines.txt");
+        FileUtils.writeStringToFile(file, "This line was there before you...");
+        
+        FileUtils.write(file, "this is brand new data", true);
+
+        String expected = "This line was there before you..."
+            + "this is brand new data";
+        String actual = FileUtils.readFileToString(file);
+        assertEquals(expected, actual);
+    }
+    
+    public void 
testWrite_WithAppendOptionFalse_ShouldDeletePreviousFileLines() throws 
Exception {
+        File file = newFile("lines.txt");
+        FileUtils.writeStringToFile(file, "This line was there before you...");
+        
+        FileUtils.write(file, "this is brand new data", false);
+
+        String expected = "this is brand new data";
+        String actual = FileUtils.readFileToString(file);
+        assertEquals(expected, actual);
+    }
+    
+    public void 
testWriteByteArrayToFile_WithAppendOptionTrue_ShouldNotDeletePreviousFileLines()
 throws Exception {
+        File file = newFile("lines.txt");
+        FileUtils.writeStringToFile(file, "This line was there before you...");
+        
+        FileUtils.writeByteArrayToFile(file, "this is brand new 
data".getBytes(), true);
+
+        String expected = "This line was there before you..."
+            + "this is brand new data";
+        String actual = FileUtils.readFileToString(file);
+        assertEquals(expected, actual);
+    }
+    
+    public void 
testWriteByteArrayToFile_WithAppendOptionFalse_ShouldDeletePreviousFileLines() 
throws Exception {
+        File file = newFile("lines.txt");
+        FileUtils.writeStringToFile(file, "This line was there before you...");
+        
+        FileUtils.writeByteArrayToFile(file, "this is brand new 
data".getBytes(), false);
+
+        String expected = "this is brand new data";
+        String actual = FileUtils.readFileToString(file);
+        assertEquals(expected, actual);
+    }
+    
     //-----------------------------------------------------------------------
     public void testChecksumCRC32() throws Exception {
         // create a test file


Reply via email to