Как прочитать InputStream в строку (String) в Java?
Лучший способ: Java 9+ с InputStream.readAllBytes()
Начиная с Java 9, появился самый простой и элегантный метод — InputStream.readAllBytes(). Он читает все байты из потока в массив, после чего вы можете преобразовать их в строку с указанием кодировки:
InputStream inputStream = new FileInputStream("file.txt");
String content = new String(inputStream.readAllBytes(), StandardCharsets.UTF_8);
Правильное закрытие ресурсов (try-with-resources)
Всегда используйте try-with-resources для автоматического закрытия потока:
try (InputStream inputStream = new FileInputStream("file.txt")) {
String content = new String(inputStream.readAllBytes(), StandardCharsets.UTF_8);
System.out.println(content);
} catch (IOException e) {
e.printStackTrace();
}
Для Java 8 и более старых версий
Если вы не можете использовать Java 9+, вот проверенный способ с BufferedReader и StringBuilder:
public String convertInputStreamToString(InputStream inputStream) throws IOException {
StringBuilder stringBuilder = new StringBuilder();
try (BufferedReader reader = new BufferedReader(
new InputStreamReader(inputStream, StandardCharsets.UTF_8))) {
String line;
while ((line = reader.readLine()) != null) {
stringBuilder.append(line).append("\n");
}
}
return stringBuilder.toString();
}
Важно: Этот метод добавляет символ новой строки после каждой строки. Если вам нужно сохранить оригинальные переносы, используйте BufferedReader.read() посимвольно.
Альтернативный метод с Scanner (Java 8+)
try (Scanner scanner = new Scanner(inputStream, StandardCharsets.UTF_8.name())) {
String content = scanner.useDelimiter("\\A").next();
return content;
} catch (NoSuchElementException e) {
return ""; // пустой поток
}
Что выбрать?
- Java 9+:
readAllBytes()— самый быстрый и простой вариант. - Java 8: Scanner с разделителем
\\A— элегантно, но медленнее на больших данных. - Любая версия: BufferedReader + StringBuilder — классика, работает стабильно.
Важные советы
- Кодировка: Всегда указывайте кодировку (
UTF-8— стандарт де-факто). Никогда не полагайтесь на кодировку по умолчанию системы. - Большие потоки: Для потоков размером более 100 МБ лучше не читать всё в память, а обрабатывать по частям.
- Производительность:
readAllBytes()в Java 9+ использует внутреннюю оптимизацию и работает быстрее, чем ручное чтение.
Использование Apache Commons IO
Если вы используете сторонние библиотеки (что часто бывает в реальных проектах), самый простой способ — это библиотека Apache Commons IO. Она предоставляет готовый утилитный метод IOUtils.toString():
import org.apache.commons.io.IOUtils;
try (InputStream inputStream = new FileInputStream("file.txt")) {
String content = IOUtils.toString(inputStream, StandardCharsets.UTF_8);
System.out.println(content);
}
Преимущества
- Не нужно писать циклы и обрабатывать буферизацию вручную.
- Работает с Java 6+.
- Корректно обрабатывает большие потоки (до 2 ГБ по умолчанию).
- Автоматически закрывает поток (если вы используете try-with-resources).
Maven зависимость
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.11.0</version>
</dependency>
Когда использовать?
Этот метод идеален, когда вы уже используете Commons IO в проекте. Если же вы не хотите добавлять новую зависимость ради одной операции, используйте нативные методы из первого ответа. Также стоит помнить, что IOUtils.toString() не закрывает поток автоматически — это нужно делать вручную или через try-with-resources.
Ответов пока нет.
Войдите чтобы оставить ответ
Блоги