Author: brentworden Date: Fri Oct 25 02:42:12 2013 New Revision: 1535612 URL: http://svn.apache.org/r1535612 Log: IO-395 overload IOUtils buffer methods to accept buffer size.
Modified: commons/proper/io/trunk/src/changes/changes.xml commons/proper/io/trunk/src/main/java/org/apache/commons/io/IOUtils.java commons/proper/io/trunk/src/main/java/org/apache/commons/io/output/ByteArrayOutputStream.java commons/proper/io/trunk/src/test/java/org/apache/commons/io/IOUtilsTestCase.java Modified: commons/proper/io/trunk/src/changes/changes.xml URL: http://svn.apache.org/viewvc/commons/proper/io/trunk/src/changes/changes.xml?rev=1535612&r1=1535611&r2=1535612&view=diff ============================================================================== --- commons/proper/io/trunk/src/changes/changes.xml (original) +++ commons/proper/io/trunk/src/changes/changes.xml Fri Oct 25 02:42:12 2013 @@ -47,6 +47,9 @@ The <action> type attribute can be add,u <body> <!-- The release date is the date RC is cut --> <release version="2.5" date="2013-??-??" description="New features and bug fixes."> + <action issue="IO-395" dev="brentworden" type="add" due-to="BELUGA BEHR"> + Overload IOUtils buffer methods to accept buffer size + </action> <action issue="IO-389" dev="sebb" type="fix" due-to="Austin Doupnik"> FileUtils.sizeOfDirectory can throw IllegalArgumentException </action> Modified: commons/proper/io/trunk/src/main/java/org/apache/commons/io/IOUtils.java URL: http://svn.apache.org/viewvc/commons/proper/io/trunk/src/main/java/org/apache/commons/io/IOUtils.java?rev=1535612&r1=1535611&r2=1535612&view=diff ============================================================================== --- commons/proper/io/trunk/src/main/java/org/apache/commons/io/IOUtils.java (original) +++ commons/proper/io/trunk/src/main/java/org/apache/commons/io/IOUtils.java Fri Oct 25 02:42:12 2013 @@ -436,6 +436,32 @@ public class IOUtils { } /** + * Fetches entire contents of an <code>InputStream</code> and represent + * same data as result InputStream. + * <p> + * This method is useful where, + * <ul> + * <li>Source InputStream is slow.</li> + * <li>It has network resources associated, so we cannot keep it open for + * long time.</li> + * <li>It has network timeout associated.</li> + * </ul> + * It can be used in favor of {@link #toByteArray(InputStream)}, since it + * avoids unnecessary allocation and copy of byte[].<br> + * This method buffers the input internally, so there is no need to use a + * <code>BufferedInputStream</code>. + * + * @param input Stream to be fully buffered. + * @param size the initial buffer size + * @return A fully buffered stream. + * @throws IOException if an I/O error occurs + * @since 2.5 + */ + public static InputStream toBufferedInputStream(final InputStream input, int size) throws IOException { + return ByteArrayOutputStream.toBufferedInputStream(input, size); + } + + /** * Returns the given reader if it is a {@link BufferedReader}, otherwise creates a BufferedReader from the given * reader. * @@ -451,6 +477,22 @@ public class IOUtils { } /** + * Returns the given reader if it is a {@link BufferedReader}, otherwise creates a BufferedReader from the given + * reader. + * + * @param reader + * the reader to wrap or return (not null) + * @param size the buffer size, if a new BufferedReader is created. + * @return the given reader or a new {@link BufferedReader} for the given reader + * @since 2.5 + * @see #buffer(Reader) + * @throws NullPointerException if the input parameter is null + */ + public static BufferedReader toBufferedReader(final Reader reader, int size) { + return reader instanceof BufferedReader ? (BufferedReader) reader : new BufferedReader(reader, size); + } + + /** * Returns the given reader if it is already a {@link BufferedReader}, otherwise creates a BufferedReader from the given * reader. * @@ -465,6 +507,21 @@ public class IOUtils { } /** + * Returns the given reader if it is already a {@link BufferedReader}, otherwise creates a BufferedReader from the given + * reader. + * + * @param reader + * the reader to wrap or return (not null) + * @param size the buffer size, if a new BufferedReader is created. + * @return the given reader or a new {@link BufferedReader} for the given reader + * @since 2.5 + * @throws NullPointerException if the input parameter is null + */ + public static BufferedReader buffer(final Reader reader, int size) { + return reader instanceof BufferedReader ? (BufferedReader) reader : new BufferedReader(reader, size); + } + + /** * Returns the given Writer if it is already a {@link BufferedWriter}, otherwise creates a BufferedWriter from the given * Writer. * @@ -479,6 +536,21 @@ public class IOUtils { } /** + * Returns the given Writer if it is already a {@link BufferedWriter}, otherwise creates a BufferedWriter from the given + * Writer. + * + * @param writer + * the Writer to wrap or return (not null) + * @param size the buffer size, if a new BufferedWriter is created. + * @return the given Writer or a new {@link BufferedWriter} for the given Writer + * @since 2.5 + * @throws NullPointerException if the input parameter is null + */ + public static BufferedWriter buffer(final Writer writer, int size) { + return writer instanceof BufferedWriter ? (BufferedWriter) writer : new BufferedWriter(writer, size); + } + + /** * Returns the given OutputStream if it is already a {@link BufferedOutputStream}, otherwise creates a BufferedOutputStream from the given * OutputStream. * @@ -497,6 +569,25 @@ public class IOUtils { } /** + * Returns the given OutputStream if it is already a {@link BufferedOutputStream}, otherwise creates a BufferedOutputStream from the given + * OutputStream. + * + * @param outputStream + * the OutputStream to wrap or return (not null) + * @param size the buffer size, if a new BufferedOutputStream is created. + * @return the given OutputStream or a new {@link BufferedOutputStream} for the given OutputStream + * @since 2.5 + * @throws NullPointerException if the input parameter is null + */ + public static BufferedOutputStream buffer(final OutputStream outputStream, int size) { + // reject null early on rather than waiting for IO operation to fail + if (outputStream == null) { // not checked by BufferedOutputStream + throw new NullPointerException(); + } + return outputStream instanceof BufferedOutputStream ? (BufferedOutputStream) outputStream : new BufferedOutputStream(outputStream, size); + } + + /** * Returns the given InputStream if it is already a {@link BufferedInputStream}, otherwise creates a BufferedInputStream from the given * InputStream. * @@ -514,6 +605,25 @@ public class IOUtils { return inputStream instanceof BufferedInputStream ? (BufferedInputStream) inputStream : new BufferedInputStream(inputStream); } + /** + * Returns the given InputStream if it is already a {@link BufferedInputStream}, otherwise creates a BufferedInputStream from the given + * InputStream. + * + * @param inputStream + * the InputStream to wrap or return (not null) + * @param size the buffer size, if a new BufferedInputStream is created. + * @return the given InputStream or a new {@link BufferedInputStream} for the given InputStream + * @since 2.5 + * @throws NullPointerException if the input parameter is null + */ + public static BufferedInputStream buffer(final InputStream inputStream, int size) { + // reject null early on rather than waiting for IO operation to fail + if (inputStream == null) { // not checked by BufferedInputStream + throw new NullPointerException(); + } + return inputStream instanceof BufferedInputStream ? (BufferedInputStream) inputStream : new BufferedInputStream(inputStream, size); + } + // read toByteArray //----------------------------------------------------------------------- /** Modified: commons/proper/io/trunk/src/main/java/org/apache/commons/io/output/ByteArrayOutputStream.java URL: http://svn.apache.org/viewvc/commons/proper/io/trunk/src/main/java/org/apache/commons/io/output/ByteArrayOutputStream.java?rev=1535612&r1=1535611&r2=1535612&view=diff ============================================================================== --- commons/proper/io/trunk/src/main/java/org/apache/commons/io/output/ByteArrayOutputStream.java (original) +++ commons/proper/io/trunk/src/main/java/org/apache/commons/io/output/ByteArrayOutputStream.java Fri Oct 25 02:42:12 2013 @@ -287,9 +287,36 @@ public class ByteArrayOutputStream exten */ public static InputStream toBufferedInputStream(final InputStream input) throws IOException { + return toBufferedInputStream(input, 1024); + } + + /** + * Fetches entire contents of an <code>InputStream</code> and represent + * same data as result InputStream. + * <p> + * This method is useful where, + * <ul> + * <li>Source InputStream is slow.</li> + * <li>It has network resources associated, so we cannot keep it open for + * long time.</li> + * <li>It has network timeout associated.</li> + * </ul> + * It can be used in favor of {@link #toByteArray()}, since it + * avoids unnecessary allocation and copy of byte[].<br> + * This method buffers the input internally, so there is no need to use a + * <code>BufferedInputStream</code>. + * + * @param input Stream to be fully buffered. + * @param size the initial buffer size + * @return A fully buffered stream. + * @throws IOException if an I/O error occurs + * @since 2.5 + */ + public static InputStream toBufferedInputStream(final InputStream input, int size) + throws IOException { // It does not matter if a ByteArrayOutputStream is not closed as close() is a no-op @SuppressWarnings("resource") - final ByteArrayOutputStream output = new ByteArrayOutputStream(); + final ByteArrayOutputStream output = new ByteArrayOutputStream(size); output.write(input); return output.toInputStream(); } Modified: commons/proper/io/trunk/src/test/java/org/apache/commons/io/IOUtilsTestCase.java URL: http://svn.apache.org/viewvc/commons/proper/io/trunk/src/test/java/org/apache/commons/io/IOUtilsTestCase.java?rev=1535612&r1=1535611&r2=1535612&view=diff ============================================================================== --- commons/proper/io/trunk/src/test/java/org/apache/commons/io/IOUtilsTestCase.java (original) +++ commons/proper/io/trunk/src/test/java/org/apache/commons/io/IOUtilsTestCase.java Fri Oct 25 02:42:12 2013 @@ -908,6 +908,20 @@ public class IOUtilsTestCase extends Fil } } + public void testToBufferedInputStreamWithBufferSize_InputStream() throws Exception { + final FileInputStream fin = new FileInputStream(m_testFile); + try { + final InputStream in = IOUtils.toBufferedInputStream(fin, 2048); + final byte[] out = IOUtils.toByteArray(in); + assertNotNull(out); + assertEquals("Not all bytes were read", 0, fin.available()); + assertEquals("Wrong output size", FILE_SIZE, out.length); + assertEqualContent(out, m_testFile); + } finally { + fin.close(); + } + } + public void testToByteArray_InputStream() throws Exception { final FileInputStream fin = new FileInputStream(m_testFile); try { @@ -1249,6 +1263,19 @@ public class IOUtilsTestCase extends Fil assertSame(bis, IOUtils.buffer(bis)); } + public void testAsBufferedInputStreamWithBufferSize() { + InputStream is = new InputStream() { + @Override + public int read() throws IOException { + return 0; + } + }; + final BufferedInputStream bis = IOUtils.buffer(is, 2048); + assertNotSame(is, bis); + assertSame(bis, IOUtils.buffer(bis)); + assertSame(bis, IOUtils.buffer(bis, 1024)); + } + public void testAsBufferedOutputStream() { OutputStream is = new OutputStream() { @Override @@ -1259,6 +1286,17 @@ public class IOUtilsTestCase extends Fil assertSame(bis, IOUtils.buffer(bis)); } + public void testAsBufferedOutputStreamWithBufferSize() { + OutputStream os = new OutputStream() { + @Override + public void write(int b) throws IOException { } + }; + final BufferedOutputStream bos = IOUtils.buffer(os, 2048); + assertNotSame(os, bos); + assertSame(bos, IOUtils.buffer(bos)); + assertSame(bos, IOUtils.buffer(bos, 1024)); + } + public void testAsBufferedReader() { Reader is = new Reader() { @Override @@ -1273,6 +1311,21 @@ public class IOUtilsTestCase extends Fil assertSame(bis, IOUtils.buffer(bis)); } + public void testAsBufferedReaderWithBufferSize() { + Reader r = new Reader() { + @Override + public int read(char[] cbuf, int off, int len) throws IOException { + return 0; + } + @Override + public void close() throws IOException { } + }; + final BufferedReader br = IOUtils.buffer(r, 2048); + assertNotSame(r, br); + assertSame(br, IOUtils.buffer(br)); + assertSame(br, IOUtils.buffer(br, 1024)); + } + public void testAsBufferedWriter() { Writer is = new Writer() { @Override @@ -1291,4 +1344,24 @@ public class IOUtilsTestCase extends Fil assertNotSame(is, bis); assertSame(bis, IOUtils.buffer(bis)); } + + public void testAsBufferedWriterWithBufferSize() { + Writer w = new Writer() { + @Override + public void write(int b) throws IOException { } + + @Override + public void write(char[] cbuf, int off, int len) throws IOException { } + + @Override + public void flush() throws IOException { } + + @Override + public void close() throws IOException { } + }; + final BufferedWriter bw = IOUtils.buffer(w, 2024); + assertNotSame(w, bw); + assertSame(bw, IOUtils.buffer(bw)); + assertSame(bw, IOUtils.buffer(bw, 1024)); + } }