Skip to content

Commit 97aad92

Browse files
committed
IO-330 IOUtils#toBufferedOutputStream/toBufferedWriter to conditionally wrap the output
Added asBufferedInputStream, asBufferedOutputStream, asBufferedReader, asBufferedWriter git-svn-id: https://svn.apache.org/repos/asf/commons/proper/io/trunk@1470251 13f79535-47bb-0310-9956-ffa450edef68
1 parent f4e275e commit 97aad92

3 files changed

Lines changed: 160 additions & 2 deletions

File tree

src/changes/changes.xml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,10 @@ 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-330" dev="sebb" type="add">
51+
IOUtils#toBufferedOutputStream/toBufferedWriter to conditionally wrap the output
52+
Added asBufferedInputStream, asBufferedOutputStream, asBufferedReader, asBufferedWriter
53+
</action>
5054
<action issue="IO-346" dev="sebb" type="add">
5155
Add ByteArrayOutputStream.toInputStream()
5256
</action>

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

Lines changed: 70 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,9 @@
1717
package org.apache.commons.io;
1818

1919
import java.io.BufferedInputStream;
20+
import java.io.BufferedOutputStream;
2021
import java.io.BufferedReader;
22+
import java.io.BufferedWriter;
2123
import java.io.ByteArrayInputStream;
2224
import java.io.CharArrayWriter;
2325
import java.io.Closeable;
@@ -434,18 +436,84 @@ public static InputStream toBufferedInputStream(final InputStream input) throws
434436
}
435437

436438
/**
437-
* Returns the given reader if it is a {@link BufferedReader}, otherwise creates a toBufferedReader for the given
439+
* Returns the given reader if it is a {@link BufferedReader}, otherwise creates a BufferedReader from the given
438440
* reader.
439441
*
440442
* @param reader
441-
* the reader to wrap or return
443+
* the reader to wrap or return (not null)
442444
* @return the given reader or a new {@link BufferedReader} for the given reader
443445
* @since 2.2
446+
* @see #asBufferedReader(Reader)
447+
* @throws NullPointerException if the input parameter is null
444448
*/
445449
public static BufferedReader toBufferedReader(final Reader reader) {
446450
return reader instanceof BufferedReader ? (BufferedReader) reader : new BufferedReader(reader);
447451
}
448452

453+
/**
454+
* Returns the given reader if it is already a {@link BufferedReader}, otherwise creates a BufferedReader from the given
455+
* reader.
456+
*
457+
* @param reader
458+
* the reader to wrap or return (not null)
459+
* @return the given reader or a new {@link BufferedReader} for the given reader
460+
* @since 2.5
461+
* @throws NullPointerException if the input parameter is null
462+
*/
463+
public static BufferedReader asBufferedReader(final Reader reader) {
464+
return reader instanceof BufferedReader ? (BufferedReader) reader : new BufferedReader(reader);
465+
}
466+
467+
/**
468+
* Returns the given Writer if it is already a {@link BufferedWriter}, otherwise creates a BufferedWriter from the given
469+
* Writer.
470+
*
471+
* @param writer
472+
* the Writer to wrap or return (not null)
473+
* @return the given Writer or a new {@link BufferedWriter} for the given Writer
474+
* @since 2.5
475+
* @throws NullPointerException if the input parameter is null
476+
*/
477+
public static BufferedWriter asBufferedWriter(final Writer writer) {
478+
return writer instanceof BufferedWriter ? (BufferedWriter) writer : new BufferedWriter(writer);
479+
}
480+
481+
/**
482+
* Returns the given OutputStream if it is already a {@link BufferedOutputStream}, otherwise creates a BufferedOutputStream from the given
483+
* OutputStream.
484+
*
485+
* @param outputStream
486+
* the OutputStream to wrap or return (not null)
487+
* @return the given OutputStream or a new {@link BufferedOutputStream} for the given OutputStream
488+
* @since 2.5
489+
* @throws NullPointerException if the input parameter is null
490+
*/
491+
public static BufferedOutputStream asBufferedOutputStream(final OutputStream outputStream) {
492+
// reject null early on rather than waiting for IO operation to fail
493+
if (outputStream == null) { // not checked by BufferedOutputStream
494+
throw new NullPointerException();
495+
}
496+
return outputStream instanceof BufferedOutputStream ? (BufferedOutputStream) outputStream : new BufferedOutputStream(outputStream);
497+
}
498+
499+
/**
500+
* Returns the given InputStream if it is already a {@link BufferedInputStream}, otherwise creates a BufferedInputStream from the given
501+
* InputStream.
502+
*
503+
* @param inputStream
504+
* the InputStream to wrap or return (not null)
505+
* @return the given InputStream or a new {@link BufferedInputStream} for the given InputStream
506+
* @since 2.5
507+
* @throws NullPointerException if the input parameter is null
508+
*/
509+
public static BufferedInputStream asBufferedInputStream(final InputStream inputStream) {
510+
// reject null early on rather than waiting for IO operation to fail
511+
if (inputStream == null) { // not checked by BufferedInputStream
512+
throw new NullPointerException();
513+
}
514+
return inputStream instanceof BufferedInputStream ? (BufferedInputStream) inputStream : new BufferedInputStream(inputStream);
515+
}
516+
449517
// read toByteArray
450518
//-----------------------------------------------------------------------
451519
/**

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

Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,9 @@
1717
package org.apache.commons.io;
1818

1919
import java.io.BufferedInputStream;
20+
import java.io.BufferedOutputStream;
2021
import java.io.BufferedReader;
22+
import java.io.BufferedWriter;
2123
import java.io.ByteArrayInputStream;
2224
import java.io.ByteArrayOutputStream;
2325
import java.io.CharArrayReader;
@@ -32,8 +34,10 @@
3234
import java.io.IOException;
3335
import java.io.InputStream;
3436
import java.io.InputStreamReader;
37+
import java.io.OutputStream;
3538
import java.io.Reader;
3639
import java.io.StringReader;
40+
import java.io.Writer;
3741
import java.net.ServerSocket;
3842
import java.net.Socket;
3943
import java.net.URI;
@@ -1205,4 +1209,86 @@ public void testToString_URL_CharsetName() throws Exception {
12051209
public void testToString_URL_CharsetNameNull() throws Exception {
12061210
testToString_URL(null);
12071211
}
1212+
1213+
public void testAsBufferedNull() {
1214+
try {
1215+
IOUtils.asBufferedInputStream(null);
1216+
fail("Expected NullPointerException");
1217+
} catch (NullPointerException npe) {
1218+
// expected
1219+
}
1220+
try {
1221+
IOUtils.asBufferedOutputStream(null);
1222+
fail("Expected NullPointerException");
1223+
} catch (NullPointerException npe) {
1224+
// expected
1225+
}
1226+
try {
1227+
IOUtils.asBufferedReader(null);
1228+
fail("Expected NullPointerException");
1229+
} catch (NullPointerException npe) {
1230+
// expected
1231+
}
1232+
try {
1233+
IOUtils.asBufferedWriter(null);
1234+
fail("Expected NullPointerException");
1235+
} catch (NullPointerException npe) {
1236+
// expected
1237+
}
1238+
}
1239+
1240+
public void testAsBufferedInputStream() {
1241+
InputStream is = new InputStream() {
1242+
@Override
1243+
public int read() throws IOException {
1244+
return 0;
1245+
}
1246+
};
1247+
final BufferedInputStream bis = IOUtils.asBufferedInputStream(is);
1248+
assertNotSame(is, bis);
1249+
assertSame(bis, IOUtils.asBufferedInputStream(bis));
1250+
}
1251+
1252+
public void testAsBufferedOutputStream() {
1253+
OutputStream is = new OutputStream() {
1254+
@Override
1255+
public void write(int b) throws IOException { }
1256+
};
1257+
final BufferedOutputStream bis = IOUtils.asBufferedOutputStream(is);
1258+
assertNotSame(is, bis);
1259+
assertSame(bis, IOUtils.asBufferedOutputStream(bis));
1260+
}
1261+
1262+
public void testAsBufferedReader() {
1263+
Reader is = new Reader() {
1264+
@Override
1265+
public int read(char[] cbuf, int off, int len) throws IOException {
1266+
return 0;
1267+
}
1268+
@Override
1269+
public void close() throws IOException { }
1270+
};
1271+
final BufferedReader bis = IOUtils.asBufferedReader(is);
1272+
assertNotSame(is, bis);
1273+
assertSame(bis, IOUtils.asBufferedReader(bis));
1274+
}
1275+
1276+
public void testAsBufferedWriter() {
1277+
Writer is = new Writer() {
1278+
@Override
1279+
public void write(int b) throws IOException { }
1280+
1281+
@Override
1282+
public void write(char[] cbuf, int off, int len) throws IOException { }
1283+
1284+
@Override
1285+
public void flush() throws IOException { }
1286+
1287+
@Override
1288+
public void close() throws IOException { }
1289+
};
1290+
final BufferedWriter bis = IOUtils.asBufferedWriter(is);
1291+
assertNotSame(is, bis);
1292+
assertSame(bis, IOUtils.asBufferedWriter(bis));
1293+
}
12081294
}

0 commit comments

Comments
 (0)