Класс Files
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() и время последнего изменения.
При этом между проверкой и следующей операцией состояние файловой системы может измениться.
Files.exists(path) описывает состояние в момент вызова.
Файл может исчезнуть или изменить права сразу после проверки, поэтому сама операция всё равно должна корректно обрабатывать ошибку.
Методы, которые возвращают Stream
Некоторые операции, например Files.list() и Files.lines(),
возвращают Stream, связанный с открытым ресурсом файловой системы.
Такой stream нужно закрывать после использования.
try (Stream<Path> entries = Files.list(Path.of("data"))) {
entries.forEach(System.out::println);
}