File и Path

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

Путь — это ещё не сам файл

Когда в коде встречается строка вроде "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() убирает из пути избыточные элементы вроде . и корректно сворачиваемые пары .., не обращаясь при этом к файловой системе.

normalize() не проверяет реальный файл. Если нужно узнать настоящий путь существующего файла с учётом символических ссылок, используется другая операция — toRealPath(), которая уже обращается к файловой системе.

Где остаётся File

File всё ещё встречается в старом API и существующем коде. Между двумя моделями можно переходить через file.toPath() и path.toFile() для путей стандартной файловой системы. В новом коде для операций с файлами обычно удобнее начинать с Path.