В чем разница классов File и Path в Java
Что проверяют
Знаете ли вы, что в Java два API для файловой системы: старый java.io.File и NIO.2 из Java 7 (java.nio.file). Следом обычно спрашивают, как переписать код с File на Files и чем неудобен File.delete().
Как отвечать
Главная мысль: File совмещает путь и операции над файлом, а в NIO.2 это разнесено. Path только описывает путь, а операции живут в утилитном классе Files.
File: класс с Java 1.0. Методыdelete(),mkdir(),renameTo()возвращаютboolean, и приfalseнепонятно, что случилось: нет прав, файла нет или каталог не пуст;Path: интерфейс, привязанный к конкретнойFileSystem. Создаётся черезPath.of(...)(с Java 11) илиPaths.get(...). Умеетresolve(),relativize(),normalize(),getParent(),toAbsolutePath()и сам по себе диск не трогает;Files: операции над путём.Files.delete()бросаетNoSuchFileExceptionилиDirectoryNotEmptyException, естьFiles.readString(),Files.lines(),Files.walk(),Files.copy()с опциейREPLACE_EXISTING, перемещение сATOMIC_MOVE;- возможности NIO.2: символические ссылки, POSIX-права, атрибуты через
Files.readAttributes(),WatchServiceдля слежения за каталогом, работа с zip-архивом как с файловой системой черезFileSystems.newFileSystem().
Мост между мирами: file.toPath() и path.toFile(). Для нового кода берут Path и Files, а File остаётся ради старых API, которые принимают только его.
Где спотыкаются
Говорят, что Path умеет создавать и удалять файлы. Сам Path этого не делает, это работа Files, а Path вполне может указывать на несуществующий файл.
Склеивают пути строками через + "/" +. Для этого есть resolve(), он сам учтёт разделитель платформы и не даст получить двойной слэш.
Забывают закрывать потоки из Files.lines() и Files.walk(). Они держат открытые дескрипторы, поэтому их оборачивают в try-with-resources, иначе на обходе большого каталога можно упереться в лимит открытых файлов.