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:

Count Occurrences of a Char in a String
Guide to @ConfigurationProperties in Spring Boot
Java Program to Implement Triply Linked List
Hướng dẫn Java Design Pattern – Command
Spring Security – Reset Your Password
Các nguyên lý thiết kế hướng đối tượng – SOLID
Spring Boot Tutorial – Bootstrap a Simple Application
Java Program to Generate a Graph for a Given Fixed Degree Sequence
String Initialization in Java
Java Program to Implement Efficient O(log n) Fibonacci generator
Java Program to Implement Hash Tables with Linear Probing
Static Content in Spring WebFlux
Bootstrapping Hibernate 5 with Spring
Java Program to Implement Expression Tree
Giới thiệu Google Guice – Binding
Java Program to Implement Bresenham Line Algorithm
Getting Started with Stream Processing with Spring Cloud Data Flow
Using the Not Operator in If Conditions in Java
Using Optional with Jackson
Adding Parameters to HttpClient Requests
Java Program to Check Whether Topological Sorting can be Performed in a Graph
Java Program to Perform Search in a BST
Introduction to Java 8 Streams
Hướng dẫn Java Design Pattern – Null Object
Java Program to Find kth Smallest Element by the Method of Partitioning the Array
A Guide to the ResourceBundle
Spring REST with a Zuul Proxy
Java Program to do a Breadth First Search/Traversal on a graph non-recursively
Java Program to Generate a Sequence of N Characters for a Given Specific Case
Java 8 StringJoiner
Show Hibernate/JPA SQL Statements from Spring Boot
Exploring the New Spring Cloud Gateway