How to read / convert an inputstream into a string in java

Posted on

In Java, converting an InputStream into a String is a common task, often needed when handling data from files, network connections, or other input sources. This process involves reading the bytes from the InputStream and then converting those bytes into characters using the appropriate character encoding. There are several ways to achieve this conversion, utilizing various Java classes and methods to ensure efficient and reliable handling of the data.

Using BufferedReader

Step-by-Step Process
One of the most efficient ways to convert an InputStream to a String is by using a BufferedReader wrapped around an InputStreamReader. This method reads the InputStream line by line and appends each line to a StringBuilder:

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;

public class InputStreamToString {
    public static String convert(InputStream inputStream) throws Exception {
        BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
        StringBuilder stringBuilder = new StringBuilder();
        String line;
        while ((line = reader.readLine()) != null) {
            stringBuilder.append(line).append("n");
        }
        reader.close();
        return stringBuilder.toString();
    }
}

This approach reads the input stream line by line, ensuring efficient memory usage and handling large streams gracefully.

Using Scanner

Simple and Concise Method
Another simple method involves using the Scanner class. While not as efficient for very large streams, it provides a concise way to convert an InputStream to a String:

import java.io.InputStream;
import java.util.Scanner;

public class InputStreamToString {
    public static String convert(InputStream inputStream) {
        Scanner scanner = new Scanner(inputStream, "UTF-8");
        String result = scanner.useDelimiter("A").next();
        scanner.close();
        return result;
    }
}

The Scanner reads the entire input stream using a delimiter that matches the beginning of the input, effectively capturing all the data.

Using Apache Commons IO

Using IOUtils
The Apache Commons IO library provides a utility method that simplifies the conversion. This method is especially useful if you are already using the library in your project:

import java.io.InputStream;
import org.apache.commons.io.IOUtils;

public class InputStreamToString {
    public static String convert(InputStream inputStream) throws IOException {
        return IOUtils.toString(inputStream, "UTF-8");
    }
}

This approach leverages the IOUtils.toString method, which handles the conversion efficiently and with minimal code.

Using Java 8 Streams

Modern Approach with Streams
For those using Java 8 or later, the streams API provides a modern and efficient way to handle this conversion:

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.stream.Collectors;

public class InputStreamToString {
    public static String convert(InputStream inputStream) throws Exception {
        try (BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream))) {
            return reader.lines().collect(Collectors.joining(System.lineSeparator()));
        }
    }
}

This method uses BufferedReader and Java 8 streams to read and join all lines from the input stream into a single string.

Using ByteArrayOutputStream

Reading InputStream into ByteArrayOutputStream
Another effective way involves reading the InputStream into a ByteArrayOutputStream and then converting it to a String:

import java.io.ByteArrayOutputStream;
import java.io.InputStream;

public class InputStreamToString {
    public static String convert(InputStream inputStream) throws Exception {
        ByteArrayOutputStream result = new ByteArrayOutputStream();
        byte[] buffer = new byte[1024];
        int length;
        while ((length = inputStream.read(buffer)) != -1) {
            result.write(buffer, 0, length);
        }
        return result.toString("UTF-8");
    }
}

This approach reads the input stream in chunks, making it suitable for large streams and avoiding potential memory issues.

Handling Exceptions

Proper Exception Handling
When converting an InputStream to a String, it’s important to handle exceptions properly to ensure the robustness of your application. Common exceptions include IOException and UnsupportedEncodingException. Here’s how you might handle them:

import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.BufferedReader;

public class InputStreamToString {
    public static String convert(InputStream inputStream) {
        try (BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream))) {
            StringBuilder stringBuilder = new StringBuilder();
            String line;
            while ((line = reader.readLine()) != null) {
                stringBuilder.append(line).append("n");
            }
            return stringBuilder.toString();
        } catch (IOException e) {
            e.printStackTrace();
            return null;
        }
    }
}

This example uses a try-with-resources statement to ensure that the BufferedReader is closed automatically, and catches any IOException that might occur during the reading process.

Performance Considerations

Efficiency and Memory Usage
When dealing with large input streams, consider the memory implications of the conversion method you choose. Methods that read the entire stream into memory, such as using Scanner or IOUtils, may not be suitable for very large data. Instead, using a buffered approach or reading in chunks (as with ByteArrayOutputStream) can help manage memory usage more efficiently.

Summary

Converting an InputStream into a String in Java is a common task with several approaches, each suited to different scenarios. Using BufferedReader with InputStreamReader is efficient for most cases, while Scanner provides a simple and concise method for smaller streams. Apache Commons IO offers a convenient utility method, and Java 8 streams provide a modern approach. ByteArrayOutputStream is effective for handling large streams in chunks. Proper exception handling and performance considerations are crucial to ensure robust and efficient code. By understanding and applying these methods, you can effectively convert InputStreams to Strings in your Java applications.

Was this helpful?

Thanks for your feedback!