Преобразование InputStream в строку в Java

Научитесь преобразовывать InputStream в строку с помощью классов BufferedReader, Scanner или IOUtils.

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

1. Использование InputStream.readAllBytes()(начиная с Java 9)

API InputStream.readAllBytes() преобразует входной поток в байты. Затем мы используем новый String() для создания нового объекта String.

InputStream in = new FileInputStream(new File("C:/temp/test.txt"));String fileContent = new String( in.readAllBytes() );

Внутри он использует метод readNBytes(Integer.MAX_VALUE). Это означает, что его не следует использовать для чтения файлов размером более 2 ГБ.

2. Использование BufferedReader

Использование BufferedReader — самый простой и популярный способ чтения файла в String. Он помогает читать файл как InputStream и обрабатывать его построчно.

 InputStream in = new FileInputStream(new File("C:/temp/test.txt"));BufferedReader читатель = new BufferedReader(new InputStreamReader(in));StringBuilder выход = новый StringBuilder();Веревочная леска;в то время как((строка = читатель.readLine()) != null) {out.append(строка);}Строка fileContent = out.toString();читатель.закрыть();

В качестве альтернативы мы можем использовать метод BufferedReader.lines() [добавленный в Java 8], чтобы получить поток строк и обработать содержимое по мере необходимости.

InputStream in = new FileInputStream(new File("C:/temp/test.txt"));String newLine = System.getProperty("line.separator");String fileContent;try(Stream<String> lines = new BufferedReader(new InputStreamReader(in)).lines()) {fileContent = lines.collect(Collectors.joining(newLine));}//Use fileContent

3. Google Гуава IO

Библиотека Guava имеет несколько очень полезных классов и методов для выполнения операций ввода-вывода. Эти классы скрывают все сложности, которые в противном случае были бы раскрыты.

3.1 Зависимости

Зависимость Maven для Google Guava.

 <зависимость><groupId>com.google.guava</groupId><artifactId>гуава</artifactId><версия>31.1-jre</версия></зависимость>

3.2 Использование ByteSource

ByteSource представляет собой читаемый источник байтов, например файл. Он имеет служебные методы, которые обычно реализуются путем открытия потока, выполнения чего-либо и, наконец, закрытия открытого потока.

Его метод asCharSource(charset) декодирует байты, считанные из источника, как символы в заданном Charset. Он возвращает символы как String в качестве выходных данных метода.

 InputStream inputStream = new FileInputStream(new File("C:/temp/test.txt"));Источник байта Источник байта = новый Источник байта() {@Переопределитьpublic InputStream openStream() выдает IOException {возврат входного потока;}};Строка fileContent = byteSource.asCharSource(Наборы символов.UTF_8).читать();

3.3 Использование CharStreams

Класс CharStreams также предоставляет вспомогательные методы для работы с символьными потоками. Использование InputStreamReader вместе с CharStreams помогает преобразовать InputStream в String.

Программа Java для преобразования InputStream в String с классом CharStreams в библиотеке Google Guava.

 InputStream inputStream = new FileInputStream(new File("C:/temp/test.txt"));Строка fileContent = null;попробуйте(конечный читатель Reader = новый InputStreamReader(inputStream)) {fileContent = CharStreams.toString(reader);}System.out.println(fileContent);

4. Apache Commons IO

4.1 Зависимости

Включите в проект следующие зависимости для включения jar-файлов common-io.

<dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId><version>2.11.0</version></dependency>

4.2 Использование IOUtils

Apache commons имеет очень полезный класс IOUtils для чтения содержимого файла в String. Это делает код намного чище и проще для чтения. Это также обеспечивает лучшую производительность.

Используйте любой из двух методов:

  1. IOUtils.копировать()
  2. IOUtils.toString()
//Метод 1 IOUtils.copy()StringWriter писатель = новый StringWriter();IOUtils.copy(new FileInputStream(new File("C:/temp/test.txt")), writer, "UTF-8");Строка fileContent = writer.toString();System.out.println(fileContent);//Метод 2 IOUtils.toString()Строка fileContent = IOUtils.toString(new FileInputStream(new File("C:/temp/test.txt")), "UTF-8");System.out.println(fileContent);

5. Java InputStream в строку с использованием сканера

Использование класса Scanner не так популярно, но оно работает. Причина, по которой это работает, заключается в том, что Scanner перебирает токены в потоке, и в этом процессе мы можем разделять токены, используя «начало входной границы», тем самым давая нам только один токен для всего содержимого потока.

 FileInputStream fin = new FileInputStream(new File("C:/temp/test.txt"));java.util.Scanner Scanner = новый java.util.Scanner(fin,"UTF-8").useDelimiter("\A");Строка fileContent = scanner.hasNext() ? scanner.next() : "";сканер.закрыть();

Вот и все. Цель этого поста — предоставить быстрые ссылки для очень конкретной цели, а именно для чтения InputStream в String.

Исходный код на Github

Прокрутить вверх