Java
Чтение и запись файлов (NIO.2)
Современный 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);
}
}