Avatar ·

Как прочитать содержимое файла в строку Java? (File to String)

Всем привет! Я новичок в Java и никак не могу разобраться с чтением файлов. Мне нужно прочитать весь текстовый файл в одну строку String, чтобы потом обработать её (например, разбить на строки или найти подстроку). Пробовал писать сам, но код получается громоздким и не работает: ```java File file = new File("test.txt"); String content = ""; try { FileInputStream fis = new FileInputStream(file); int b; while ((b = fis.read()) != -1) { content += (char) b; } fis.close(); } catch (IOException e) { e.printStackTrace(); } System.out.println(content); ``` Проблемы: 1. Если файл большой, программа тормозит (я слышал про конкатенацию строк в цикле — это плохо). 2. Кодировка не указана — на Windows русские буквы превращаются в кракозябры. 3. Если забыть закрыть поток, могут быть утечки памяти. 4. Код выглядит ужасно — слишком много строк для такой простой задачи. Подскажите, как правильно и красиво прочитать файл в строку в современной Java? Может, есть готовые утилиты или новые фичи? Заранее спасибо! P.S. Версия Java 17, если это важно. <<>>

Лучший способ: 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()) и выполнить другие операции, которые эта библиотека упрощает.