Как прочитать содержимое файла в строку Java? (из File, InputStream, Path)
Лучший способ: читаем файл в строку одной строкой кода (Java 11+)
С появлением Java 11 задача чтения файла в строку стала тривиальной. Самый простой и рекомендуемый подход — использовать метод Files.readString() из пакета java.nio.file. Он автоматически обрабатывает закрытие ресурсов, использует try-with-resources внутри себя и возвращает готовую строку.
import java.nio.file.Files;
import java.nio.file.Path;
import java.io.IOException;
public class FileToStringExample {
public static void main(String[] args) throws IOException {
// Читаем весь файл в строку (кодировка UTF-8 по умолчанию)
String content = Files.readString(Path.of("data.txt"));
System.out.println(content);
}
}
Если вам нужно указать другую кодировку (например, Windows-1251 или ISO-8859-1), используйте перегруженную версию:
import java.nio.charset.Charset;
// ...
String content = Files.readString(Path.of("data.txt"), Charset.forName("Windows-1251"));
Что делать, если у вас Java 8 или 10?
Для более старых версий Java (8, 9, 10) используйте комбинацию Files.lines() (или Files.readAllLines()) с коллекторами. Это тоже очень компактно:
import java.nio.file.Files;
import java.nio.file.Path;
import java.io.IOException;
import java.util.stream.Collectors;
public class FileToStringJava8 {
public static void main(String[] args) throws IOException {
// Вариант 1: с разделителем строк
String content = Files.lines(Path.of("data.txt"))
.collect(Collectors.joining(System.lineSeparator()));
// Вариант 2: если разделитель не нужен (просто склеить всё)
// String content = Files.lines(Path.of("data.txt"))
// .collect(Collectors.joining());
System.out.println(content);
}
}
Обратите внимание: Files.lines() возвращает Stream<String>, который автоматически закрывается после обработки (если вы используете его внутри try-with-resources или до конечной операции, как в примере).
Почему ваш старый код плох и как его исправить?
- Конкатенация строк в цикле — создаёт множество промежуточных объектов String, что ведёт к падению производительности. Используйте
StringBuilderилиStringBuffer. - Явное закрытие ресурсов — легко забыть. Используйте try-with-resources (Java 7+): ресурсы закрываются автоматически.
- Смешивание старого и нового API —
FileReader/BufferedReader— это устаревший подход. Современный код используетjava.nio.file.Files.
Исправленный вариант для Java 7 (если нужно поддерживать древние версии):
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
public class OldSchoolButCorrect {
public static void main(String[] args) {
StringBuilder sb = new StringBuilder();
try (BufferedReader br = new BufferedReader(new FileReader("data.txt"))) {
String line;
while ((line = br.readLine()) != null) {
sb.append(line).append(System.lineSeparator());
}
} catch (IOException e) {
e.printStackTrace();
}
String content = sb.toString();
System.out.println(content);
}
}
Как работать с InputStream?
Если у вас InputStream (например, из сети или ресурсов), используйте new String(inputStream.readAllBytes(), StandardCharsets.UTF_8) (Java 9+):
import java.io.InputStream;
import java.nio.charset.StandardCharsets;
// Пример: читаем из ресурсов класса
InputStream is = getClass().getResourceAsStream("/data.txt");
String content = new String(is.readAllBytes(), StandardCharsets.UTF_8);
Итоговая рекомендация
Для Java 11+ — всегда используйте Files.readString(). Для Java 8 — Files.lines() + Collectors.joining(). Избегайте ручного управления ресурсами и конкатенации в циклах. Код должен быть коротким, читаемым и надёжным.
Альтернативный подход: с помощью Apache Commons IO или Guava
Если вы используете сторонние библиотеки (например, в проектах на Spring или Android), можно воспользоваться утилитами из Apache Commons IO или Google Guava. Это особенно удобно, если вы уже подключили эти зависимости.
Apache Commons IO
Добавьте в pom.xml (или build.gradle):
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.15.1</version>
</dependency>
Затем используйте метод FileUtils.readFileToString():
import org.apache.commons.io.FileUtils;
import java.io.File;
import java.nio.charset.StandardCharsets;
String content = FileUtils.readFileToString(new File("data.txt"), StandardCharsets.UTF_8);
Google Guava
Добавьте зависимость:
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>33.0.0-jre</version>
</dependency>
Используйте Files.asCharSource():
import com.google.common.io.Files;
import java.io.File;
import java.nio.charset.StandardCharsets;
String content = Files.asCharSource(new File("data.txt"), StandardCharsets.UTF_8).read();
Когда это удобно?
- Если вы работаете с Java 7 или 8 и не хотите писать много кода.
- Если в проекте уже есть эти библиотеки (например, в Android-разработке часто используют Guava).
- Для работы с ресурсами (classpath) — у обеих библиотек есть методы для
InputStream.
Минусы: лишняя зависимость в проекте. Для чистого Java-решения лучше использовать встроенные средства (Java 11+).