Java

Чтение и запись файлов (NIO.2)

Algonexys · 07.08.2026 · 👁 0

Современный API java.nio.file: построчная обработка больших файлов, обход каталогов, атомарная запись.

Код

import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.nio.file.*;
import java.util.List;
import java.util.stream.Stream;

public class FileExamples {

    public static void main(String[] args) throws IOException {
        Path file = Path.of("data", "report.txt");

        // Запись (создаст каталоги при необходимости)
        Files.createDirectories(file.getParent());
        Files.writeString(file, "Первая строка\n", StandardCharsets.UTF_8);
        Files.writeString(file, "Дописано\n", StandardCharsets.UTF_8,
                          StandardOpenOption.APPEND);

        // Чтение целиком — только для небольших файлов
        String content = Files.readString(file, StandardCharsets.UTF_8);
        List<String> lines = Files.readAllLines(file, StandardCharsets.UTF_8);

        // Потоковая обработка большого файла без загрузки в память
        try (Stream<String> stream = Files.lines(file, StandardCharsets.UTF_8)) {
            long errors = stream.filter(l -> l.contains("ERROR")).count();
            System.out.println("Строк с ошибками: " + errors);
        }

        // Рекурсивный обход каталога
        try (Stream<Path> paths = Files.walk(Path.of("src"))) {
            paths.filter(Files::isRegularFile)
                 .filter(p -> p.toString().endsWith(".java"))
                 .forEach(System.out::println);
        }

        // Атомарная замена: пишем во временный файл и переименовываем
        Path tmp = Files.createTempFile("report", ".tmp");
        Files.writeString(tmp, content);
        Files.move(tmp, file, StandardCopyOption.REPLACE_EXISTING,
                   StandardCopyOption.ATOMIC_MOVE);
    }
}