Как прочитать / преобразовать InputStream в строку в Java?

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

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

Способы преобразования InputStream в строку

Я нашел 11 основных способов сделать это (см. ниже). И я написал несколько тестов производительности (см. результаты ниже):

Использование IOUtils.toString (Apache Utils)

Использование потоков CharStreams (Guava)

Использование сканера (JDK)

Использование Stream API (Java 8). Предупреждение: Это решение конвертирует различные переносы строк (например, \r\n) в \n.

Использование параллельного Stream API (Java 8). Предупреждение: Это решение конвертирует различные переносы строк (например, \r\n) в \n.

Использование InputStreamReader и StringBuilder (JDK)

Использование StringWriter и IOUtils.copy (Apache Commons)

Использование ByteArrayOutputStream и inputStream.read (JDK)

Использование BufferedReader (JDK). Предупреждение: Это решение преобразует различные переносы строк (например, \n\r) в системное свойство line.separator (например, в Windows в «\r\n»).

Использование BufferedInputStream и ByteArrayOutputStream (JDK)

Использование inputStream.read() и StringBuilder (JDK). Предупреждение: Данное решение имеет проблемы с Unicode, например, с русским текстом (корректно работает только с не-Unicode текстом)

Внимание:

  • Решения 4, 5 и 9 преобразуют разные переносы строк в один.
  • Решение 11 не может корректно работать с текстом Unicode