Как прочитать содержимое файла в строку Java? (File to String)
Лучший способ: Files.readString() (Java 11+)
Начиная с Java 11, в стандартной библиотеке появился идеальный метод для вашей задачи — Files.readString(). Он читает весь файл в строку одним вызовом, автоматически закрывает ресурсы и позволяет указать кодировку.
import java.nio.file.Files;
import java.nio.file.Path;
import java.io.IOException;
public class FileToString {
public static void main(String[] args) {
try {
// Простейший вариант — читаем в кодировке UTF-8
String content = Files.readString(Path.of("test.txt"));
System.out.println(content);
} catch (IOException e) {
System.err.println("Ошибка чтения файла: " + e.getMessage());
}
}
}
Что здесь происходит?
- Path.of("test.txt") — создаёт объект пути к файлу (современная замена
new File()). - Files.readString() — читает весь файл, закрывает поток, возвращает строку.
- try-catch — обрабатывает возможные ошибки (файл не найден, нет прав доступа и т.д.).
Указание кодировки
По умолчанию используется UTF-8. Если файл в другой кодировке (например, Windows-1251), укажите её вторым параметром:
import java.nio.charset.Charset;
String content = Files.readString(Path.of("test.txt"), Charset.forName("Windows-1251"));
Почему это лучший способ?
- Простота — 1 строка кода вместо 10+.
- Производительность — метод оптимизирован, нет конкатенации строк в цикле.
- Безопасность — ресурсы закрываются автоматически (try-with-resources под капотом).
- Кодировка — явно указывается, нет сюрпризов с кракозябрами.
Для старых версий Java (Java 8/9/10)
Если вы застряли на старой версии, используйте Files.readAllLines() и объедините строки:
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.List;
String content = String.join("\n", Files.readAllLines(Paths.get("test.txt")));
Или классический вариант с BufferedReader (но он многословнее):
StringBuilder sb = new StringBuilder();
try (BufferedReader br = Files.newBufferedReader(Paths.get("test.txt"))) {
String line;
while ((line = br.readLine()) != null) {
sb.append(line).append("\n");
}
}
String content = sb.toString();
Важные замечания
- Метод
readString()загружает весь файл в память. Для огромных файлов (гигабайты) лучше использовать потоковую обработку. - Всегда обрабатывайте
IOException— файл может быть удалён или заблокирован. - В Java 17 (как у вас)
Files.readString()работает отлично — это стандартный подход.
Ваш код с FileInputStream и конкатенацией строк — это типичная ошибка новичков. Запомните: никогда не используйте += для строк в цикле! StringBuilder или готовые методы — ваши друзья.
Альтернатива: Apache Commons IO
Если вы уже используете библиотеку Apache Commons IO в проекте (например, для других операций с файлами), можно воспользоваться утилитным классом FileUtils:
import org.apache.commons.io.FileUtils;
import java.io.File;
import java.nio.charset.StandardCharsets;
String content = FileUtils.readFileToString(new File("test.txt"), StandardCharsets.UTF_8);
Этот метод:
- Работает с Java 7+ (если нужна совместимость со старыми версиями).
- Не требует указывать кодировку отдельно (но лучше всегда указывать явно).
- Автоматически закрывает потоки.
Недостаток: нужно подключать внешнюю зависимость (Maven: commons-io:commons-io:2.11.0). Для простых задач лучше использовать встроенный Files.readString() — он не требует лишних библиотек и работает быстрее.
Когда использовать: если в проекте уже есть Apache Commons, или если нужно прочитать файл в список строк (readLines()) и выполнить другие операции, которые эта библиотека упрощает.