File и Path
Путь — это ещё не сам файл
Когда в коде встречается строка вроде "data/users.txt",
она сама по себе ничего не знает о файловой системе. Для работы с путями Java предлагает
старый класс File и современный интерфейс Path.
Оба описывают местоположение файла или каталога, но не означают, что этот объект действительно существует на диске.
Path path = Path.of("data", "users.txt");
System.out.println(path.getFileName()); // users.txt
System.out.println(path.getParent()); // data
Path удобно воспринимать как структурированный путь:
у него есть отдельные элементы, родитель, имя файла и операции для безопасной сборки новых путей.
Само создание Path не обращается к файлу и не создаёт его.
Относительные и абсолютные пути
Относительный путь интерпретируется относительно текущего рабочего каталога процесса, а абсолютный уже содержит достаточно информации, чтобы начинать поиск от корня файловой системы.
Path relative = Path.of("logs", "app.log");
Path absolute = relative.toAbsolutePath();
System.out.println(relative.isAbsolute()); // false
System.out.println(absolute.isAbsolute()); // true
Абсолютный путь не обязательно означает, что файл существует. Это всё ещё описание пути, а не результат проверки файловой системы.
resolve и normalize
Пути лучше собирать как пути, а не конкатенацией строк с / или \\.
Метод resolve() добавляет один путь к другому с учётом правил файловой системы.
Path root = Path.of("project");
Path config = root.resolve("config").resolve("app.properties");
System.out.println(config);
Метод normalize() убирает из пути избыточные элементы вроде .
и корректно сворачиваемые пары .., не обращаясь при этом к файловой системе.
toRealPath(), которая уже обращается к файловой системе.
Где остаётся File
File всё ещё встречается в старом API и существующем коде.
Между двумя моделями можно переходить через file.toPath()
и path.toFile() для путей стандартной файловой системы.
В новом коде для операций с файлами обычно удобнее начинать с Path.