This article shows a few ways to convert an java.io.InputStream to a String.
Table of contents
- 1. ByteArrayOutputStream
- 2. InputStream#readAllBytes (Java 9)
- 3. InputStreamReader + StringBuilder
- 4. InputStreamReader + BufferedReader (modified line breaks)
- 5. Java 8 BufferedReader#lines (modified line breaks)
- 6. Apache Commons IO
- 7. Download Source Code
- 8. References
What are modified line breaks?
Some InputStream to String conversions (#4 and #5) will modify the original line breaks, which converts the original line breaks to the system property line.separator – which is \r\n on Windows, \n on Linux.
1. ByteArrayOutputStream
Note
This ByteArrayOutputStream solution is the fastest way to convert InputStream to String, less conversion, support input streams with large amounts of data, keep the original line breaks, and it works in all Java versions.
This example opens a website google.com as an InputStream, and we use ByteArrayOutputStream to convert the InputStream to a String and print it out.
package com.mkyong.string;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URI;
public class ConvertInputStreamToString {
public static final int DEFAULT_BUFFER_SIZE = 8192;
public static void main(String[] args) throws IOException {
URI uri = URI.create("https://www.google.com/");
try (InputStream inputStream = uri.toURL().openStream()) {
// Convert InputStream -> String
String result = convertInputStreamToString(inputStream);
System.out.println(result);
}
}
// Plain Java
private static String convertInputStreamToString(InputStream is) throws IOException {
ByteArrayOutputStream result = new ByteArrayOutputStream();
byte[] buffer = new byte[DEFAULT_BUFFER_SIZE];
int length;
while ((length = is.read(buffer)) != -1) {
result.write(buffer, 0, length);
}
// Java 1.1
//return result.toString(StandardCharsets.UTF_8.name());
return result.toString("UTF-8");
// Java 10
//return result.toString(StandardCharsets.UTF_8);
}
}
2. InputStream#readAllBytes (Java 9)
2.1 In Java 9, we can use the new InputStream#readAllBytes() API to convert the input stream to bytes, later we use the new String() to create a new String object.
// @Java 9 -> inputStream.readAllBytes()
// max bytes Integer.MAX_VALUE, 2147483647, which is 2G
private static String convertInputStreamToString(InputStream inputStream)
throws IOException {
return new String(inputStream.readAllBytes(), StandardCharsets.UTF_8);
}
2.2 Review the InputStream source code; it reads all bytes into a byte array, which has a limit of Integer.MAX_VALUE or 2G; Since then, it is not intended for reading input streams with large amounts of data.
package java.io;
public abstract class InputStream implements Closeable {
public byte[] readAllBytes() throws IOException {
return readNBytes(Integer.MAX_VALUE);
}
//...
}
3. InputStreamReader + StringBuilder
The Reader read a char at a time, slow.
// InputStreamReader + StringBuilder
private static String convertInputStreamToString(InputStream inputStream)
throws IOException {
final char[] buffer = new char[8192];
final StringBuilder result = new StringBuilder();
// InputStream -> Reader
try (Reader reader = new InputStreamReader(inputStream, StandardCharsets.UTF_8)) {
int charsRead;
while ((charsRead = reader.read(buffer, 0, buffer.length)) > 0) {
result.append(buffer, 0, charsRead);
}
}
return result.toString();
}
4. InputStreamReader + BufferedReader (modified line breaks)
The common practice is wrapping the Reader with a BufferedReader.
private static String convertInputStreamToString(InputStream inputStream)
throws IOException {
String newLine = System.getProperty("line.separator");
StringBuilder result = new StringBuilder();
try (BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream))) {
String line;
while ((line = reader.readLine()) != null) {
result
.append(line)
.append(newLine);
}
}
return result.toString();
}
5. Java 8 BufferedReader#lines (modified line breaks)
Java 8 added a new lines API to the BufferedReader class to convert all lines into a Stream.
private static String convertInputStreamToString4(InputStream inputStream)
throws IOException {
String newLine = System.getProperty("line.separator");
String result;
try (Stream<String> lines = new BufferedReader(new InputStreamReader(inputStream)).lines()) {
result = lines.collect(Collectors.joining(newLine));
}
return result;
}
6. Apache Commons IO
If you have the commons-io library in the project, try the IOUtils.toString() to convert InputStream to String.
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.11.0</version>
</dependency>
private static String convertInputStreamToString(InputStream inputStream)
throws IOException {
return IOUtils.toString(inputStream, StandardCharsets.UTF_8);
}
Review the IOUtils.toString source code, the IOUtils class copy the InputStream into a StringWriter.
package org.apache.commons.io;
public class IOUtils {
public static String toString(final InputStream input, final Charset charset)
throws IOException {
try (final StringBuilderWriter sw = new StringBuilderWriter()) {
copy(input, sw, charset);
return sw.toString();
}
}
//...
}
Is vice-versa possible i.e to write a String to InputStream in Java?
String str = "mkyong.com";
InputStream is = new ByteArrayInputStream(str.getBytes(StandardCharsets.UTF_8));
https://www.mkyong.com/java/how-to-convert-string-to-inputstream-in-java/
Thank you so much, finally I could print some text gotten from a GET request in Android…
Thanks a lot !
Good tutorial
I prefer to use IOUtils.toString(InputStream) from Apache Commons.