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