Класс Files

Базовый Java
≈ 2 мин чтения

Files — высокоуровневые операции вокруг Path

Path описывает путь, а класс Files выполняет над этим путём операции: создаёт файлы и каталоги, читает и пишет данные, копирует, перемещает, удаляет и получает свойства файловой системы. Это набор статических методов, поэтому отдельный объект Files создавать не нужно.

Path path = Path.of("notes.txt");

Files.writeString(path, "Hello", StandardCharsets.UTF_8);
String text = Files.readString(path, StandardCharsets.UTF_8);

Для небольшого текстового файла такие методы часто проще, чем вручную собирать цепочку reader/writer. Но удобство не отменяет вопрос размера: методы, которые возвращают весь файл одной строкой или массивом, загружают всё содержимое в память.

Каталоги, копирование и перемещение

Path source = Path.of("data", "report.txt");
Path backup = Path.of("backup", "report.txt");

Files.createDirectories(backup.getParent());
Files.copy(source, backup);

createDirectories() создаёт недостающие каталоги по пути и не требует, чтобы каждый родитель создавался отдельным вызовом. Для копирования и перемещения поведение при существующем целевом файле настраивается опциями, например StandardCopyOption.REPLACE_EXISTING.

Проверки и метаданные

Через Files можно проверять тип пути и читать свойства файла: например isDirectory(), isRegularFile(), size() и время последнего изменения. При этом между проверкой и следующей операцией состояние файловой системы может измениться.

exists() — не гарантия будущего успеха. Проверка Files.exists(path) описывает состояние в момент вызова. Файл может исчезнуть или изменить права сразу после проверки, поэтому сама операция всё равно должна корректно обрабатывать ошибку.

Методы, которые возвращают Stream

Некоторые операции, например Files.list() и Files.lines(), возвращают Stream, связанный с открытым ресурсом файловой системы. Такой stream нужно закрывать после использования.

try (Stream<Path> entries = Files.list(Path.of("data"))) {
    entries.forEach(System.out::println);
}