How to convert InputStream to String in Java
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.