Skip to content

Commit 9e15115

Browse files
author
Brent Worden
committed
IO-395 overload IOUtils buffer methods to accept buffer size.
git-svn-id: https://svn.apache.org/repos/asf/commons/proper/io/trunk@1535612 13f79535-47bb-0310-9956-ffa450edef68
1 parent 7663775 commit 9e15115

4 files changed

Lines changed: 214 additions & 1 deletion

File tree

src/changes/changes.xml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,9 @@ The <action> type attribute can be add,update,fix,remove.
4747
<body>
4848
<!-- The release date is the date RC is cut -->
4949
<release version="2.5" date="2013-??-??" description="New features and bug fixes.">
50+
<action issue="IO-395" dev="brentworden" type="add" due-to="BELUGA BEHR">
51+
Overload IOUtils buffer methods to accept buffer size
52+
</action>
5053
<action issue="IO-389" dev="sebb" type="fix" due-to="Austin Doupnik">
5154
FileUtils.sizeOfDirectory can throw IllegalArgumentException
5255
</action>

src/main/java/org/apache/commons/io/IOUtils.java

Lines changed: 110 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -435,6 +435,32 @@ public static InputStream toBufferedInputStream(final InputStream input) throws
435435
return ByteArrayOutputStream.toBufferedInputStream(input);
436436
}
437437

438+
/**
439+
* Fetches entire contents of an <code>InputStream</code> and represent
440+
* same data as result InputStream.
441+
* <p>
442+
* This method is useful where,
443+
* <ul>
444+
* <li>Source InputStream is slow.</li>
445+
* <li>It has network resources associated, so we cannot keep it open for
446+
* long time.</li>
447+
* <li>It has network timeout associated.</li>
448+
* </ul>
449+
* It can be used in favor of {@link #toByteArray(InputStream)}, since it
450+
* avoids unnecessary allocation and copy of byte[].<br>
451+
* This method buffers the input internally, so there is no need to use a
452+
* <code>BufferedInputStream</code>.
453+
*
454+
* @param input Stream to be fully buffered.
455+
* @param size the initial buffer size
456+
* @return A fully buffered stream.
457+
* @throws IOException if an I/O error occurs
458+
* @since 2.5
459+
*/
460+
public static InputStream toBufferedInputStream(final InputStream input, int size) throws IOException {
461+
return ByteArrayOutputStream.toBufferedInputStream(input, size);
462+
}
463+
438464
/**
439465
* Returns the given reader if it is a {@link BufferedReader}, otherwise creates a BufferedReader from the given
440466
* reader.
@@ -450,6 +476,22 @@ public static BufferedReader toBufferedReader(final Reader reader) {
450476
return reader instanceof BufferedReader ? (BufferedReader) reader : new BufferedReader(reader);
451477
}
452478

479+
/**
480+
* Returns the given reader if it is a {@link BufferedReader}, otherwise creates a BufferedReader from the given
481+
* reader.
482+
*
483+
* @param reader
484+
* the reader to wrap or return (not null)
485+
* @param size the buffer size, if a new BufferedReader is created.
486+
* @return the given reader or a new {@link BufferedReader} for the given reader
487+
* @since 2.5
488+
* @see #buffer(Reader)
489+
* @throws NullPointerException if the input parameter is null
490+
*/
491+
public static BufferedReader toBufferedReader(final Reader reader, int size) {
492+
return reader instanceof BufferedReader ? (BufferedReader) reader : new BufferedReader(reader, size);
493+
}
494+
453495
/**
454496
* Returns the given reader if it is already a {@link BufferedReader}, otherwise creates a BufferedReader from the given
455497
* reader.
@@ -464,6 +506,21 @@ public static BufferedReader buffer(final Reader reader) {
464506
return reader instanceof BufferedReader ? (BufferedReader) reader : new BufferedReader(reader);
465507
}
466508

509+
/**
510+
* Returns the given reader if it is already a {@link BufferedReader}, otherwise creates a BufferedReader from the given
511+
* reader.
512+
*
513+
* @param reader
514+
* the reader to wrap or return (not null)
515+
* @param size the buffer size, if a new BufferedReader is created.
516+
* @return the given reader or a new {@link BufferedReader} for the given reader
517+
* @since 2.5
518+
* @throws NullPointerException if the input parameter is null
519+
*/
520+
public static BufferedReader buffer(final Reader reader, int size) {
521+
return reader instanceof BufferedReader ? (BufferedReader) reader : new BufferedReader(reader, size);
522+
}
523+
467524
/**
468525
* Returns the given Writer if it is already a {@link BufferedWriter}, otherwise creates a BufferedWriter from the given
469526
* Writer.
@@ -478,6 +535,21 @@ public static BufferedWriter buffer(final Writer writer) {
478535
return writer instanceof BufferedWriter ? (BufferedWriter) writer : new BufferedWriter(writer);
479536
}
480537

538+
/**
539+
* Returns the given Writer if it is already a {@link BufferedWriter}, otherwise creates a BufferedWriter from the given
540+
* Writer.
541+
*
542+
* @param writer
543+
* the Writer to wrap or return (not null)
544+
* @param size the buffer size, if a new BufferedWriter is created.
545+
* @return the given Writer or a new {@link BufferedWriter} for the given Writer
546+
* @since 2.5
547+
* @throws NullPointerException if the input parameter is null
548+
*/
549+
public static BufferedWriter buffer(final Writer writer, int size) {
550+
return writer instanceof BufferedWriter ? (BufferedWriter) writer : new BufferedWriter(writer, size);
551+
}
552+
481553
/**
482554
* Returns the given OutputStream if it is already a {@link BufferedOutputStream}, otherwise creates a BufferedOutputStream from the given
483555
* OutputStream.
@@ -496,6 +568,25 @@ public static BufferedOutputStream buffer(final OutputStream outputStream) {
496568
return outputStream instanceof BufferedOutputStream ? (BufferedOutputStream) outputStream : new BufferedOutputStream(outputStream);
497569
}
498570

571+
/**
572+
* Returns the given OutputStream if it is already a {@link BufferedOutputStream}, otherwise creates a BufferedOutputStream from the given
573+
* OutputStream.
574+
*
575+
* @param outputStream
576+
* the OutputStream to wrap or return (not null)
577+
* @param size the buffer size, if a new BufferedOutputStream is created.
578+
* @return the given OutputStream or a new {@link BufferedOutputStream} for the given OutputStream
579+
* @since 2.5
580+
* @throws NullPointerException if the input parameter is null
581+
*/
582+
public static BufferedOutputStream buffer(final OutputStream outputStream, int size) {
583+
// reject null early on rather than waiting for IO operation to fail
584+
if (outputStream == null) { // not checked by BufferedOutputStream
585+
throw new NullPointerException();
586+
}
587+
return outputStream instanceof BufferedOutputStream ? (BufferedOutputStream) outputStream : new BufferedOutputStream(outputStream, size);
588+
}
589+
499590
/**
500591
* Returns the given InputStream if it is already a {@link BufferedInputStream}, otherwise creates a BufferedInputStream from the given
501592
* InputStream.
@@ -514,6 +605,25 @@ public static BufferedInputStream buffer(final InputStream inputStream) {
514605
return inputStream instanceof BufferedInputStream ? (BufferedInputStream) inputStream : new BufferedInputStream(inputStream);
515606
}
516607

608+
/**
609+
* Returns the given InputStream if it is already a {@link BufferedInputStream}, otherwise creates a BufferedInputStream from the given
610+
* InputStream.
611+
*
612+
* @param inputStream
613+
* the InputStream to wrap or return (not null)
614+
* @param size the buffer size, if a new BufferedInputStream is created.
615+
* @return the given InputStream or a new {@link BufferedInputStream} for the given InputStream
616+
* @since 2.5
617+
* @throws NullPointerException if the input parameter is null
618+
*/
619+
public static BufferedInputStream buffer(final InputStream inputStream, int size) {
620+
// reject null early on rather than waiting for IO operation to fail
621+
if (inputStream == null) { // not checked by BufferedInputStream
622+
throw new NullPointerException();
623+
}
624+
return inputStream instanceof BufferedInputStream ? (BufferedInputStream) inputStream : new BufferedInputStream(inputStream, size);
625+
}
626+
517627
// read toByteArray
518628
//-----------------------------------------------------------------------
519629
/**

src/main/java/org/apache/commons/io/output/ByteArrayOutputStream.java

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -287,9 +287,36 @@ public synchronized void writeTo(final OutputStream out) throws IOException {
287287
*/
288288
public static InputStream toBufferedInputStream(final InputStream input)
289289
throws IOException {
290+
return toBufferedInputStream(input, 1024);
291+
}
292+
293+
/**
294+
* Fetches entire contents of an <code>InputStream</code> and represent
295+
* same data as result InputStream.
296+
* <p>
297+
* This method is useful where,
298+
* <ul>
299+
* <li>Source InputStream is slow.</li>
300+
* <li>It has network resources associated, so we cannot keep it open for
301+
* long time.</li>
302+
* <li>It has network timeout associated.</li>
303+
* </ul>
304+
* It can be used in favor of {@link #toByteArray()}, since it
305+
* avoids unnecessary allocation and copy of byte[].<br>
306+
* This method buffers the input internally, so there is no need to use a
307+
* <code>BufferedInputStream</code>.
308+
*
309+
* @param input Stream to be fully buffered.
310+
* @param size the initial buffer size
311+
* @return A fully buffered stream.
312+
* @throws IOException if an I/O error occurs
313+
* @since 2.5
314+
*/
315+
public static InputStream toBufferedInputStream(final InputStream input, int size)
316+
throws IOException {
290317
// It does not matter if a ByteArrayOutputStream is not closed as close() is a no-op
291318
@SuppressWarnings("resource")
292-
final ByteArrayOutputStream output = new ByteArrayOutputStream();
319+
final ByteArrayOutputStream output = new ByteArrayOutputStream(size);
293320
output.write(input);
294321
return output.toInputStream();
295322
}

src/test/java/org/apache/commons/io/IOUtilsTestCase.java

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -908,6 +908,20 @@ public void testToBufferedInputStream_InputStream() throws Exception {
908908
}
909909
}
910910

911+
public void testToBufferedInputStreamWithBufferSize_InputStream() throws Exception {
912+
final FileInputStream fin = new FileInputStream(m_testFile);
913+
try {
914+
final InputStream in = IOUtils.toBufferedInputStream(fin, 2048);
915+
final byte[] out = IOUtils.toByteArray(in);
916+
assertNotNull(out);
917+
assertEquals("Not all bytes were read", 0, fin.available());
918+
assertEquals("Wrong output size", FILE_SIZE, out.length);
919+
assertEqualContent(out, m_testFile);
920+
} finally {
921+
fin.close();
922+
}
923+
}
924+
911925
public void testToByteArray_InputStream() throws Exception {
912926
final FileInputStream fin = new FileInputStream(m_testFile);
913927
try {
@@ -1249,6 +1263,19 @@ public int read() throws IOException {
12491263
assertSame(bis, IOUtils.buffer(bis));
12501264
}
12511265

1266+
public void testAsBufferedInputStreamWithBufferSize() {
1267+
InputStream is = new InputStream() {
1268+
@Override
1269+
public int read() throws IOException {
1270+
return 0;
1271+
}
1272+
};
1273+
final BufferedInputStream bis = IOUtils.buffer(is, 2048);
1274+
assertNotSame(is, bis);
1275+
assertSame(bis, IOUtils.buffer(bis));
1276+
assertSame(bis, IOUtils.buffer(bis, 1024));
1277+
}
1278+
12521279
public void testAsBufferedOutputStream() {
12531280
OutputStream is = new OutputStream() {
12541281
@Override
@@ -1259,6 +1286,17 @@ public void write(int b) throws IOException { }
12591286
assertSame(bis, IOUtils.buffer(bis));
12601287
}
12611288

1289+
public void testAsBufferedOutputStreamWithBufferSize() {
1290+
OutputStream os = new OutputStream() {
1291+
@Override
1292+
public void write(int b) throws IOException { }
1293+
};
1294+
final BufferedOutputStream bos = IOUtils.buffer(os, 2048);
1295+
assertNotSame(os, bos);
1296+
assertSame(bos, IOUtils.buffer(bos));
1297+
assertSame(bos, IOUtils.buffer(bos, 1024));
1298+
}
1299+
12621300
public void testAsBufferedReader() {
12631301
Reader is = new Reader() {
12641302
@Override
@@ -1273,6 +1311,21 @@ public void close() throws IOException { }
12731311
assertSame(bis, IOUtils.buffer(bis));
12741312
}
12751313

1314+
public void testAsBufferedReaderWithBufferSize() {
1315+
Reader r = new Reader() {
1316+
@Override
1317+
public int read(char[] cbuf, int off, int len) throws IOException {
1318+
return 0;
1319+
}
1320+
@Override
1321+
public void close() throws IOException { }
1322+
};
1323+
final BufferedReader br = IOUtils.buffer(r, 2048);
1324+
assertNotSame(r, br);
1325+
assertSame(br, IOUtils.buffer(br));
1326+
assertSame(br, IOUtils.buffer(br, 1024));
1327+
}
1328+
12761329
public void testAsBufferedWriter() {
12771330
Writer is = new Writer() {
12781331
@Override
@@ -1291,4 +1344,24 @@ public void close() throws IOException { }
12911344
assertNotSame(is, bis);
12921345
assertSame(bis, IOUtils.buffer(bis));
12931346
}
1347+
1348+
public void testAsBufferedWriterWithBufferSize() {
1349+
Writer w = new Writer() {
1350+
@Override
1351+
public void write(int b) throws IOException { }
1352+
1353+
@Override
1354+
public void write(char[] cbuf, int off, int len) throws IOException { }
1355+
1356+
@Override
1357+
public void flush() throws IOException { }
1358+
1359+
@Override
1360+
public void close() throws IOException { }
1361+
};
1362+
final BufferedWriter bw = IOUtils.buffer(w, 2024);
1363+
assertNotSame(w, bw);
1364+
assertSame(bw, IOUtils.buffer(bw));
1365+
assertSame(bw, IOUtils.buffer(bw, 1024));
1366+
}
12941367
}

0 commit comments

Comments
 (0)