Java – Reader to InputStream

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 VietMX’s Blog.

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 the Commons IO solution – also a simple one liner:

@Test
public void givenUsingCommonsIO_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.

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.

Related posts:

Java Program to Implement Red Black Tree
Sorting in Java
So sánh ArrayList và LinkedList trong Java
Java Web Services – JAX-WS – SOAP
Sort a HashMap in Java
Tính trừu tượng (Abstraction) trong Java
Hướng dẫn Java Design Pattern – State
Java Program to find the maximum subarray sum using Binary Search approach
Tính kế thừa (Inheritance) trong java
Prevent Brute Force Authentication Attempts with Spring Security
Logging a Reactive Sequence
Simplify the DAO with Spring and Java Generics
Converting a List to String in Java
Java Program to Show the Duality Transformation of Line and Point
Java Program to Implement Booth Algorithm
Receive email using POP3
New Features in Java 12
Java Program to Generate Random Numbers Using Multiply with Carry Method
Lập trình đa luồng với CompletableFuture trong Java 8
Java Program to Construct K-D Tree for 2 Dimensional Data
Java Program to Describe the Representation of Graph using Incidence Matrix
Toán tử instanceof trong java
Java Program to Implement Segment Tree
Spring Boot - Zuul Proxy Server and Routing
Inheritance and Composition (Is-a vs Has-a relationship) in Java
Java Program to Implement the Monoalphabetic Cypher
Hướng dẫn sử dụng luồng vào ra nhị phân trong Java
Java Program to Sort an Array of 10 Elements Using Heap Sort Algorithm
Java Program to Check whether Undirected Graph is Connected using DFS
Generic Constructors in Java
Posting with HttpClient
Java Program to Find Number of Spanning Trees in a Complete Bipartite Graph