How do I read / convert an InputStream into a String in Java?
Как мне прочитать / преобразовать входной поток в строку в Java?
Если у вас есть java.io.InputStream объект, как вы должны обработать этот объект и создать String?
Предположим, у меня есть InputStream который содержит текстовые данные, и я хочу преобразовать его в String, так что, например, я могу записать это в файл журнала.
Какой самый простой способ взять InputStream и преобразовать его в String?
public String convertStreamToString(InputStream is) { // ??? }
Переведено автоматически
Ответ 1
Подводя итог другим ответам, я нашел 11 основных способов сделать это (см. Ниже). И я написал несколько тестов производительности (см. Результаты Ниже).:
Используя BufferedReader (JDK). Предупреждение: Это решение преобразует различные переносы строк (например, \n\r) в line.separator системное свойство (например, в Windows в "\ r \n").
Используя BufferedInputStream и ByteArrayOutputStream (JDK)
BufferedInputStreambis=newBufferedInputStream(inputStream); ByteArrayOutputStreambuf=newByteArrayOutputStream(); for (intresult= bis.read(); result != -1; result = bis.read()) { buf.write((byte) result); } // StandardCharsets.UTF_8.name() > JDK 7 return buf.toString("UTF-8");
Using inputStream.read() and StringBuilder (JDK). Warning: This solution has problems with Unicode, for example with Russian text (works correctly only with non-Unicode text)
Я научился этому трюку из статьи "Глупые трюки со сканером". Причина, по которой это работает, заключается в том, что Scanner выполняет итерацию по токенам в потоке, и в этом случае мы разделяем токены, используя "начало входной границы" (\ A), таким образом, предоставляя нам только один токен для всего содержимого потока.
Примечание, если вам нужно уточнить кодировку входного потока, вы можете предоставить второй аргумент Scanner конструктору, который указывает, какой набор символов использовать (например, "UTF-8").
Совет по шляпе также адресован Джейкобу, который однажды указал мне на указанную статью.