In this quick tutorial we’re going to look at the conversion from a Reader to an InputStream – first with plain Java, then with Guava and finally with the Apache Commons IO library.
This article is part of the “Java – Back to Basic” series here on Baeldung.
1. With Java
Let’s start with the Java solution:
@Test
public void givenUsingPlainJava_whenConvertingReaderIntoInputStream_thenCorrect()
throws IOException {
Reader initialReader = new StringReader("With Java");
char[] charBuffer = new char[8 * 1024];
StringBuilder builder = new StringBuilder();
int numCharsRead;
while ((numCharsRead = initialReader.read(charBuffer, 0, charBuffer.length)) != -1) {
builder.append(charBuffer, 0, numCharsRead);
}
InputStream targetStream = new ByteArrayInputStream(
builder.toString().getBytes(StandardCharsets.UTF_8));
initialReader.close();
targetStream.close();
}
Notice that we’re reading (and writing) chunks of data at a time.
2. With Guava
Next – let’s look at the much simpler Guava solution:
@Test
public void givenUsingGuava_whenConvertingReaderIntoInputStream_thenCorrect()
throws IOException {
Reader initialReader = new StringReader("With Guava");
InputStream targetStream =
new ByteArrayInputStream(CharStreams.toString(initialReader)
.getBytes(Charsets.UTF_8));
initialReader.close();
targetStream.close();
}
Notice that we’re using an out of the box input stream which turns the entire conversion into a one liner.
3. With Commons IO
Finally – let’s look at couple of Commons IO solutions – also simple one liners.
First, using ReaderInputStream:
@Test
public void givenUsingCommonsIOReaderInputStream_whenConvertingReaderIntoInputStream()
throws IOException {
Reader initialReader = new StringReader("With Commons IO");
InputStream targetStream = new ReaderInputStream(initialReader, Charsets.UTF_8);
initialReader.close();
targetStream.close();
}
Lastly, the same conversion using IOUtils:
@Test
public void givenUsingCommonsIOUtils_whenConvertingReaderIntoInputStream()
throws IOException {
Reader initialReader = new StringReader("With Commons IO");
InputStream targetStream =
IOUtils.toInputStream(IOUtils.toString(initialReader), Charsets.UTF_8);
initialReader.close();
targetStream.close();
}
Note that we’re here dealing with any kind of Reader – but if you’re working specifically with text data, it’s always a good idea to specify the charset explicitly rather than use the JVM default.
4. Conclusion
And there you have it – 3 simple ways to transform the Reader into an InputStream. Make sure to check out the sample over on GitHub.