Как мне прочитать / преобразовать InputStream в строку в Java? - PullRequest
3675 голосов
/ 21 ноября 2008

Если у вас есть объект java.io.InputStream, как вы должны обработать этот объект и получить String?


Предположим, у меня есть InputStream, который содержит текстовые данные, и я хочу преобразовать его в String, поэтому, например, я могу записать это в файл журнала.

Какой самый простой способ взять InputStream и преобразовать его в String?

public String convertStreamToString(InputStream is) {
    // ???
}

Ответы [ 60 ]

15 голосов
/ 09 апреля 2014

Вот полный метод преобразования InputStream в String без использования сторонней библиотеки. Используйте StringBuilder для однопоточной среды, в противном случае используйте StringBuffer.

public static String getString( InputStream is) throws IOException {
    int ch;
    StringBuilder sb = new StringBuilder();
    while((ch = is.read()) != -1)
        sb.append((char)ch);
    return sb.toString();
}
14 голосов
/ 02 ноября 2012

Вот как это сделать, используя только JDK, используя буферы байтового массива. Вот как все методы commons-io IOUtils.copy() работают. Вы можете заменить byte[] на char[], если копируете с Reader вместо InputStream.

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

...

InputStream is = ....
ByteArrayOutputStream baos = new ByteArrayOutputStream(8192);
byte[] buffer = new byte[8192];
int count = 0;
try {
  while ((count = is.read(buffer)) != -1) {
    baos.write(buffer, 0, count);
  }
}
finally {
  try {
    is.close();
  }
  catch (Exception ignore) {
  }
}

String charset = "UTF-8";
String inputStreamAsString = baos.toString(charset);
12 голосов
/ 04 февраля 2015

Пользователи Kotlin просто делают:

println(InputStreamReader(is).readText())

, тогда как

readText()

- это встроенный метод расширения стандартной библиотеки Kotlin.

12 голосов
/ 29 июля 2016

Еще один, для всех пользователей Spring:

import java.nio.charset.StandardCharsets;
import org.springframework.util.FileCopyUtils;

public String convertStreamToString(InputStream is) throws IOException { 
    return new String(FileCopyUtils.copyToByteArray(is), StandardCharsets.UTF_8);
}

Служебные методы в org.springframework.util.StreamUtils аналогичны методам в FileCopyUtils, но при завершении они оставляют поток открытым.

12 голосов
/ 28 января 2016

Используйте java.io.InputStream.transferTo (OutputStream) , поддерживаемый в Java 9, и ByteArrayOutputStream.toString (String) , который принимает имя кодировки:

public static String gobble(InputStream in, String charsetName) throws IOException {
    ByteArrayOutputStream bos = new ByteArrayOutputStream();
    in.transferTo(bos);
    return bos.toString(charsetName);
}
9 голосов
/ 08 июня 2014

Это хорошо, потому что:

  • Безопасность рук Charset.
  • Вы управляете размером буфера чтения.
  • Вы можете указать длину строителя и не совсем точно.
  • Свободен от библиотечных зависимостей.
  • Для Java 7 или выше.

Зачем?

public static String convertStreamToString(InputStream is) throws IOException {
   StringBuilder sb = new StringBuilder(2048); // Define a size if you have an idea of it.
   char[] read = new char[128]; // Your buffer size.
   try (InputStreamReader ir = new InputStreamReader(is, StandardCharsets.UTF_8)) {
     for (int i; -1 != (i = ir.read(read)); sb.append(read, 0, i));
   } catch (Throwable t) {}
   return sb.toString();
}

Для JDK 9

public static String inputStreamString(InputStream inputStream) throws IOException {
    try (inputStream) {
        return new String(inputStream.readAllBytes(), StandardCharsets.UTF_8);
    }
}
7 голосов
/ 09 августа 2016

Самый простой способ в JDK - использовать следующие фрагменты кода.

String convertToString(InputStream in){
    String resource = new Scanner(in).useDelimiter("\\Z").next();
    return resource;
}
6 голосов
/ 02 сентября 2015

Вот мое решение на основе Java 8 , которое использует новый Stream API для сбора всех строк из InputStream:

public static String toString(InputStream inputStream) {
    BufferedReader reader = new BufferedReader(
        new InputStreamReader(inputStream));
    return reader.lines().collect(Collectors.joining(
        System.getProperty("line.separator")));
}
5 голосов
/ 26 января 2017

В Groovy

inputStream.getText()
5 голосов
/ 21 января 2016

В терминах reduce и concat это может быть выражено в Java 8 как:

String fromFile = new BufferedReader(new   
InputStreamReader(inputStream)).lines().reduce(String::concat).get();
...