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 Find the Minimum Element of a Rotated Sorted Array using Binary Search approach
Giới thiệu Google Guice – Binding
Spring Cloud – Adding Angular
Creating a Web Application with Spring 5
Java Program to Implement D-ary-Heap
Service Registration with Eureka
Spring Boot with Multiple SQL Import Files
Java – Convert File to InputStream
Java Program to Implement ConcurrentHashMap API
Immutable Objects in Java
Java Program to Implement Hopcroft Algorithm
Serialize Only Fields that meet a Custom Criteria with Jackson
Java Program to Generate Random Partition out of a Given Set of Numbers or Characters
Java Program to Implement Disjoint Sets
Java Program to Perform Arithmetic Operations on Numbers of Size
Spring REST with a Zuul Proxy
Java Program to Implement Cartesian Tree
Guide to Spring Cloud Kubernetes
How to Store Duplicate Keys in a Map in Java?
Java Program to Describe the Representation of Graph using Adjacency Matrix
Send email with JavaMail
Java Program to Implement Warshall Algorithm
Java Program to Implement wheel Sieve to Generate Prime Numbers Between Given Range
Hướng dẫn Java Design Pattern – Object Pool
Java Program to Implement Levenshtein Distance Computing Algorithm
Java Program to Perform the Sorting Using Counting Sort
Java Program to Implement RenderingHints API
Guide to the Java ArrayList
Java Program to Generate All Possible Combinations of a Given List of Numbers
Guide to java.util.concurrent.Future
Chuyển đổi từ HashMap sang ArrayList
Introduction to the Java ArrayDeque