You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@commons.apache.org by sc...@apache.org on 2005/09/07 01:00:03 UTC
svn commit: r279170 - in /jakarta/commons/proper/io/trunk: RELEASE-NOTES.txt
src/java/org/apache/commons/io/IOUtils.java
src/test/org/apache/commons/io/IOUtilsTestCase.java
src/test/org/apache/commons/io/IOUtilsWriteTestCase.java
Author: scolebourne
Date: Tue Sep 6 15:59:54 2005
New Revision: 279170
URL: http://svn.apache.org/viewcvs?rev=279170&view=rev
Log:
Add IOUtils.writeLines
Modified:
jakarta/commons/proper/io/trunk/RELEASE-NOTES.txt
jakarta/commons/proper/io/trunk/src/java/org/apache/commons/io/IOUtils.java
jakarta/commons/proper/io/trunk/src/test/org/apache/commons/io/IOUtilsTestCase.java
jakarta/commons/proper/io/trunk/src/test/org/apache/commons/io/IOUtilsWriteTestCase.java
Modified: jakarta/commons/proper/io/trunk/RELEASE-NOTES.txt
URL: http://svn.apache.org/viewcvs/jakarta/commons/proper/io/trunk/RELEASE-NOTES.txt?rev=279170&r1=279169&r2=279170&view=diff
==============================================================================
--- jakarta/commons/proper/io/trunk/RELEASE-NOTES.txt (original)
+++ jakarta/commons/proper/io/trunk/RELEASE-NOTES.txt Tue Sep 6 15:59:54 2005
@@ -58,6 +58,14 @@
Enhancements from 1.0
---------------------
+- FilenameUtils - new class
+ A static utility class for working with filenames
+ Seeks to ease the pain of developing on Windows and deploying on Unix
+
+- FileSystemUtils - new class
+ A static utility class for working with file systems
+ Provides one method at present, to get the free space on the filing system
+
- IOUtils - toByteArray(Reader,encoding)
Handles encodings when reading to a byte array
@@ -75,6 +83,11 @@
- toInputStream(String,encoding)
Creates an input stream that uses the string as a source of data
+- IOUtils - writeLines(Collection,lineEnding,OutputStream)
+ - writeLines(Collection,lineEnding,OutputStream,encoding)
+ - writeLines(Collection,lineEnding,Writer)
+ Writes a collection to a file line by line
+
- IOUtils - write(...)
Write data to a stream/writer (moved from CopyUtils with better null handling)
@@ -98,14 +111,6 @@
- FileUtils - readLines(File,encoding)
Reads a file line by line into a List of Strings
-
-- FilenameUtils - new class
- A static utility class for working with filenames
- Seeks to ease the pain of developing on Windows and deploying on Unix
-
-- FileSystemUtils - new class
- A static utility class for working with file systems
- Provides one method at present, to get the free space on the filing system
- ConditionalFileFilter - new interface
Defines the behaviour of list based filters
Modified: jakarta/commons/proper/io/trunk/src/java/org/apache/commons/io/IOUtils.java
URL: http://svn.apache.org/viewcvs/jakarta/commons/proper/io/trunk/src/java/org/apache/commons/io/IOUtils.java?rev=279170&r1=279169&r2=279170&view=diff
==============================================================================
--- jakarta/commons/proper/io/trunk/src/java/org/apache/commons/io/IOUtils.java (original)
+++ jakarta/commons/proper/io/trunk/src/java/org/apache/commons/io/IOUtils.java Tue Sep 6 15:59:54 2005
@@ -17,17 +17,22 @@
import java.io.BufferedInputStream;
import java.io.BufferedReader;
+import java.io.BufferedWriter;
import java.io.ByteArrayInputStream;
import java.io.CharArrayWriter;
+import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
+import java.io.PrintWriter;
import java.io.Reader;
import java.io.StringWriter;
import java.io.Writer;
import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Iterator;
import java.util.List;
import org.apache.commons.io.output.ByteArrayOutputStream;
@@ -77,6 +82,38 @@
// or return one of them.
/**
+ * The Unix directory separator character.
+ */
+ public static final char DIR_SEPARATOR_UNIX = '/';
+ /**
+ * The Windows directory separator character.
+ */
+ public static final char DIR_SEPARATOR_WINDOWS = '\\';
+ /**
+ * The system directory separator character.
+ */
+ public static final char DIR_SEPARATOR = File.separatorChar;
+ /**
+ * The Unix line separator string.
+ */
+ public static final String LINE_SEPARATOR_UNIX = "\n";
+ /**
+ * The Windows line separator string.
+ */
+ public static final String LINE_SEPARATOR_WINDOWS = "\r\n";
+ /**
+ * The system line separator string.
+ */
+ public static final String LINE_SEPARATOR;
+ static {
+ // avoid security issues
+ StringWriter buf = new StringWriter(4);
+ PrintWriter out = new PrintWriter(buf);
+ out.println();
+ LINE_SEPARATOR = buf.toString();
+ }
+
+ /**
* The default buffer size to use.
*/
private static final int DEFAULT_BUFFER_SIZE = 1024 * 4;
@@ -761,6 +798,102 @@
} else {
output.write(data.toString().getBytes(encoding));
}
+ }
+ }
+
+ // writeLines
+ //-----------------------------------------------------------------------
+ /**
+ * Writes the <code>toString()</code> value of each item in a collection to
+ * an <code>OutputStream</code> line by line, using the default character
+ * encoding of the platform and the specified line ending.
+ *
+ * @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 <code>OutputStream</code> to write to, not null, not closed
+ * @throws NullPointerException if the output is null
+ * @throws IOException if an I/O error occurs
+ * @since Commons IO 1.1
+ */
+ public static void writeLines(Collection lines, String lineEnding,
+ OutputStream output) throws IOException {
+ if (lines == null) {
+ return;
+ }
+ if (lineEnding == null) {
+ lineEnding = LINE_SEPARATOR;
+ }
+ for (Iterator it = lines.iterator(); it.hasNext(); ) {
+ Object line = it.next();
+ if (line != null) {
+ output.write(line.toString().getBytes());
+ }
+ output.write(lineEnding.getBytes());
+ }
+ }
+
+ /**
+ * Writes the <code>toString()</code> value of each item in a collection to
+ * an <code>OutputStream</code> line by line, using the specified character
+ * encoding and the specified line ending.
+ * <p>
+ * Character encoding names can be found at
+ * <a href="http://www.iana.org/assignments/character-sets">IANA</a>.
+ *
+ * @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 <code>OutputStream</code> to write to, not null, not closed
+ * @param encoding the encoding to use, null means platform default
+ * @throws NullPointerException if the output is null
+ * @throws IOException if an I/O error occurs
+ * @since Commons IO 1.1
+ */
+ public static void writeLines(Collection lines, String lineEnding,
+ OutputStream output, String encoding) throws IOException {
+ if (encoding == null) {
+ writeLines(lines, lineEnding, output);
+ } else {
+ if (lines == null) {
+ return;
+ }
+ if (lineEnding == null) {
+ lineEnding = LINE_SEPARATOR;
+ }
+ for (Iterator it = lines.iterator(); it.hasNext(); ) {
+ Object line = it.next();
+ if (line != null) {
+ output.write(line.toString().getBytes(encoding));
+ }
+ output.write(lineEnding.getBytes(encoding));
+ }
+ }
+ }
+
+ /**
+ * Writes the <code>toString()</code> value of each item in a collection to
+ * a <code>Writer</code> line by line, using the specified line ending.
+ *
+ * @param lines the lines to write, null entries produce blank lines
+ * @param lineEnding the line separator to use, null is system default
+ * @param writer the <code>Writer</code> to write to, not null, not closed
+ * @throws NullPointerException if the input is null
+ * @throws IOException if an I/O error occurs
+ * @since Commons IO 1.1
+ */
+ public static void writeLines(Collection lines, String lineEnding,
+ Writer writer) throws IOException {
+ if (lines == null) {
+ return;
+ }
+ if (lineEnding == null) {
+ lineEnding = LINE_SEPARATOR;
+ }
+ for (Iterator it = lines.iterator(); it.hasNext(); ) {
+ Object line = it.next();
+ if (line != null) {
+ writer.write(line.toString());
+ }
+ writer.write(lineEnding);
}
}
Modified: jakarta/commons/proper/io/trunk/src/test/org/apache/commons/io/IOUtilsTestCase.java
URL: http://svn.apache.org/viewcvs/jakarta/commons/proper/io/trunk/src/test/org/apache/commons/io/IOUtilsTestCase.java?rev=279170&r1=279169&r2=279170&view=diff
==============================================================================
--- jakarta/commons/proper/io/trunk/src/test/org/apache/commons/io/IOUtilsTestCase.java (original)
+++ jakarta/commons/proper/io/trunk/src/test/org/apache/commons/io/IOUtilsTestCase.java Tue Sep 6 15:59:54 2005
@@ -49,6 +49,9 @@
* @author Ian Springer
*/
public class IOUtilsTestCase extends FileBasedTestCase {
+
+ /** Determine if this is windows. */
+ private static final boolean WINDOWS = (File.separatorChar == '\\');
/*
* Note: this is not particularly beautiful code. A better way to check for
* flush and close status would be to implement "trojan horse" wrapper
@@ -93,6 +96,22 @@
super( name );
}
+ //-----------------------------------------------------------------------
+ public void testConstants() throws Exception {
+ assertEquals('/', IOUtils.DIR_SEPARATOR_UNIX);
+ assertEquals('\\', IOUtils.DIR_SEPARATOR_WINDOWS);
+ assertEquals("\n", IOUtils.LINE_SEPARATOR_UNIX);
+ assertEquals("\r\n", IOUtils.LINE_SEPARATOR_WINDOWS);
+ if (WINDOWS) {
+ assertEquals('\\', IOUtils.DIR_SEPARATOR);
+ assertEquals("\r\n", IOUtils.LINE_SEPARATOR);
+ } else {
+ assertEquals('/', IOUtils.DIR_SEPARATOR);
+ assertEquals("\n", IOUtils.LINE_SEPARATOR);
+ }
+ }
+
+ //-----------------------------------------------------------------------
/** Assert that the contents of two byte arrays are the same. */
private void assertEqualContent( byte[] b0, byte[] b1 )
throws IOException
Modified: jakarta/commons/proper/io/trunk/src/test/org/apache/commons/io/IOUtilsWriteTestCase.java
URL: http://svn.apache.org/viewcvs/jakarta/commons/proper/io/trunk/src/test/org/apache/commons/io/IOUtilsWriteTestCase.java?rev=279170&r1=279169&r2=279170&view=diff
==============================================================================
--- jakarta/commons/proper/io/trunk/src/test/org/apache/commons/io/IOUtilsWriteTestCase.java (original)
+++ jakarta/commons/proper/io/trunk/src/test/org/apache/commons/io/IOUtilsWriteTestCase.java Tue Sep 6 15:59:54 2005
@@ -15,10 +15,18 @@
*/
package org.apache.commons.io;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.InputStream;
+import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
+import java.io.Reader;
+import java.io.StringWriter;
import java.io.Writer;
import java.util.Arrays;
+import java.util.List;
import junit.framework.Test;
import junit.framework.TestSuite;
@@ -40,13 +48,6 @@
*/
public class IOUtilsWriteTestCase extends FileBasedTestCase {
- /*
- * NOTE this is not particularly beautiful code. A better way to check for
- * flush and close status would be to implement "trojan horse" wrapper
- * implementations of the various stream classes, which set a flag when
- * relevant methods are called. (JT)
- */
-
private static final int FILE_SIZE = 1024 * 4 + 1;
@@ -359,8 +360,6 @@
}
public void testWrite_charArrayToOutputStream_Encoding_nullData() throws Exception {
- String str = new String(inData, "US-ASCII");
-
ByteArrayOutputStream baout = new ByteArrayOutputStream();
YellOnFlushAndCloseOutputStream out = new YellOnFlushAndCloseOutputStream(baout, true, true);
@@ -425,6 +424,192 @@
String str = new String(inData, "US-ASCII");
try {
IOUtils.write(str.toCharArray(), (Writer) null);
+ fail();
+ } catch (NullPointerException ex) {}
+ }
+
+ //-----------------------------------------------------------------------
+ public void testWriteLines_OutputStream() throws Exception {
+ Object[] data = new Object[] {
+ "hello", new StringBuffer("world"), "", "this is", null, "some text"};
+ List list = Arrays.asList(data);
+
+ ByteArrayOutputStream baout = new ByteArrayOutputStream();
+ YellOnFlushAndCloseOutputStream out = new YellOnFlushAndCloseOutputStream(baout, false, true);
+
+ IOUtils.writeLines(list, "*", out);
+
+ out.off();
+ out.flush();
+
+ String expected = "hello*world**this is**some text*";
+ String actual = baout.toString();
+ assertEquals(expected, actual);
+ }
+
+ public void testWriteLines_OutputStream_nullData() throws Exception {
+ ByteArrayOutputStream baout = new ByteArrayOutputStream();
+ YellOnFlushAndCloseOutputStream out = new YellOnFlushAndCloseOutputStream(baout, false, true);
+
+ IOUtils.writeLines((List) null, "*", out);
+ out.off();
+ out.flush();
+
+ assertEquals("Sizes differ", 0, baout.size());
+ }
+
+ public void testWriteLines_OutputStream_nullSeparator() throws Exception {
+ Object[] data = new Object[] {"hello", "world"};
+ List list = Arrays.asList(data);
+
+ ByteArrayOutputStream baout = new ByteArrayOutputStream();
+ YellOnFlushAndCloseOutputStream out = new YellOnFlushAndCloseOutputStream(baout, false, true);
+
+ IOUtils.writeLines(list, (String) null, out);
+ out.off();
+ out.flush();
+
+ String expected = "hello" + IOUtils.LINE_SEPARATOR + "world" + IOUtils.LINE_SEPARATOR;
+ String actual = baout.toString();
+ assertEquals(expected, actual);
+ }
+
+ public void testWriteLines_OutputStream_nullStream() throws Exception {
+ Object[] data = new Object[] {"hello", "world"};
+ List list = Arrays.asList(data);
+ try {
+ IOUtils.writeLines(list, "*", (OutputStream) null);
+ fail();
+ } catch (NullPointerException ex) {}
+ }
+
+ //-----------------------------------------------------------------------
+ public void testWriteLines_OutputStream_Encoding() throws Exception {
+ Object[] data = new Object[] {
+ "hello\u8364", new StringBuffer("world"), "", "this is", null, "some text"};
+ List list = Arrays.asList(data);
+
+ ByteArrayOutputStream baout = new ByteArrayOutputStream();
+ YellOnFlushAndCloseOutputStream out = new YellOnFlushAndCloseOutputStream(baout, false, true);
+
+ IOUtils.writeLines(list, "*", out, "UTF-8");
+
+ out.off();
+ out.flush();
+
+ String expected = "hello\u8364*world**this is**some text*";
+ String actual = baout.toString("UTF-8");
+ assertEquals(expected, actual);
+ }
+
+ public void testWriteLines_OutputStream_Encoding_nullData() throws Exception {
+ ByteArrayOutputStream baout = new ByteArrayOutputStream();
+ YellOnFlushAndCloseOutputStream out = new YellOnFlushAndCloseOutputStream(baout, false, true);
+
+ IOUtils.writeLines((List) null, "*", out, "US-ASCII");
+ out.off();
+ out.flush();
+
+ assertEquals("Sizes differ", 0, baout.size());
+ }
+
+ public void testWriteLines_OutputStream_Encoding_nullSeparator() throws Exception {
+ Object[] data = new Object[] {"hello", "world"};
+ List list = Arrays.asList(data);
+
+ ByteArrayOutputStream baout = new ByteArrayOutputStream();
+ YellOnFlushAndCloseOutputStream out = new YellOnFlushAndCloseOutputStream(baout, false, true);
+
+ IOUtils.writeLines(list, (String) null, out, "US-ASCII");
+ out.off();
+ out.flush();
+
+ String expected = "hello" + IOUtils.LINE_SEPARATOR + "world" + IOUtils.LINE_SEPARATOR;
+ String actual = baout.toString();
+ assertEquals(expected, actual);
+ }
+
+ public void testWriteLines_OutputStream_Encoding_nullStream() throws Exception {
+ Object[] data = new Object[] {"hello", "world"};
+ List list = Arrays.asList(data);
+ try {
+ IOUtils.writeLines(list, "*", (OutputStream) null, "US-ASCII");
+ fail();
+ } catch (NullPointerException ex) {}
+ }
+
+ public void testWriteLines_OutputStream_Encoding_nullEncoding() throws Exception {
+ Object[] data = new Object[] {
+ "hello", new StringBuffer("world"), "", "this is", null, "some text"};
+ List list = Arrays.asList(data);
+
+ ByteArrayOutputStream baout = new ByteArrayOutputStream();
+ YellOnFlushAndCloseOutputStream out = new YellOnFlushAndCloseOutputStream(baout, false, true);
+
+ IOUtils.writeLines(list, "*", out, null);
+
+ out.off();
+ out.flush();
+
+ String expected = "hello*world**this is**some text*";
+ String actual = baout.toString();
+ assertEquals(expected, actual);
+ }
+
+ //-----------------------------------------------------------------------
+ public void testWriteLines_Writer() throws Exception {
+ Object[] data = new Object[] {
+ "hello", new StringBuffer("world"), "", "this is", null, "some text"};
+ List list = Arrays.asList(data);
+
+ ByteArrayOutputStream baout = new ByteArrayOutputStream();
+ YellOnFlushAndCloseOutputStream out = new YellOnFlushAndCloseOutputStream(baout, true, true);
+ Writer writer = new OutputStreamWriter(baout, "US-ASCII");
+
+ IOUtils.writeLines(list, "*", writer);
+
+ out.off();
+ writer.flush();
+
+ String expected = "hello*world**this is**some text*";
+ String actual = baout.toString();
+ assertEquals(expected, actual);
+ }
+
+ public void testWriteLines_Writer_nullData() throws Exception {
+ ByteArrayOutputStream baout = new ByteArrayOutputStream();
+ YellOnFlushAndCloseOutputStream out = new YellOnFlushAndCloseOutputStream(baout, true, true);
+ Writer writer = new OutputStreamWriter(baout, "US-ASCII");
+
+ IOUtils.writeLines((List) null, "*", writer);
+ out.off();
+ writer.flush();
+
+ assertEquals("Sizes differ", 0, baout.size());
+ }
+
+ public void testWriteLines_Writer_nullSeparator() throws Exception {
+ Object[] data = new Object[] {"hello", "world"};
+ List list = Arrays.asList(data);
+
+ ByteArrayOutputStream baout = new ByteArrayOutputStream();
+ YellOnFlushAndCloseOutputStream out = new YellOnFlushAndCloseOutputStream(baout, true, true);
+ Writer writer = new OutputStreamWriter(baout, "US-ASCII");
+
+ IOUtils.writeLines(list, (String) null, writer);
+ out.off();
+ writer.flush();
+
+ String expected = "hello" + IOUtils.LINE_SEPARATOR + "world" + IOUtils.LINE_SEPARATOR;
+ String actual = baout.toString();
+ assertEquals(expected, actual);
+ }
+
+ public void testWriteLines_Writer_nullStream() throws Exception {
+ Object[] data = new Object[] {"hello", "world"};
+ List list = Arrays.asList(data);
+ try {
+ IOUtils.writeLines(list, "*", (Writer) null);
fail();
} catch (NullPointerException ex) {}
}
---------------------------------------------------------------------
To unsubscribe, e-mail: commons-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: commons-dev-help@jakarta.apache.org