Научитесь преобразовывать 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. Это делает код намного чище и проще для чтения. Это также обеспечивает лучшую производительность.
Используйте любой из двух методов:
- IOUtils.копировать()
- 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.