Я завершу очень хороший ответ @mmcrae
.
. Есть ли какая-либо причина для использования объекта java.io.File, или мы можем считать его устаревшим?
Классы JDK очень редко устаревают.
Вы можете видеть в список устаревших API JDK 8 все классы, которые устарели с момента первого JDK.
Он содержит только небольшую частьклассы, которые не рекомендуется использовать в документации Oracle и сообществе Java.
java.util.Date
, java.util.Vector
, java.util.Hashtable
... которые являются классами с таким количеством дефектов, не устарели.
Но почему?
Поскольку концептуально что-то из deprecated
означает, что все еще существует, но использовать его не рекомендуется, поскольку оно наверняка будет удалено.
Тысячи программ полагаются на эти плохо спроектированные классы.
Для таких классов разработчики Java API не будутподайте такой сигнал.
Ответ @EJP
настолько правдив:
Не, если и до тех пор, пока он не будет так отмечен в Javadoc.
Итак, я думаю, что ваш вопрос будет иметь больше смысла в терминах:
"Поскольку у нас есть выбор, следует ли нам использовать java.io.File
или java.nio.file.Path
для новых разработок и если ответ будет java.nio.file.Path
Могли бы вы легко воспользоваться преимуществом java.io.File
для устаревших проектов, использующих java.io.File
? "
Я считаю, что java.nio.file.Path может делать все, что может делать java.io.File, иподробнее.
У вас есть ответ.
Этот урок оракула о устаревших операциях ввода-вывода подтверждает ваше мышление.
До выпуска Java SE 7 класс java.io.File
был механизмом, используемым дляфайловый ввод-вывод, но у него было несколько недостатков.
Многие методы не генерировали исключения при сбое, поэтому было невозможно получить полезное сообщение об ошибке.Например, если удаление файла завершилось неудачно, программа получит сообщение «Ошибка удаления», но не узнает, произошло ли это из-за того, что файл не существует, у пользователя не было разрешений или возникла другая проблема.
Метод переименования не работал согласованно на разных платформах.Реальной поддержки символических ссылок не было.
Требовалась дополнительная поддержка метаданных, таких как права доступа к файлам, владелец файла и другие атрибуты безопасности.
Доступ к метаданным файла был неэффективным.
Многие методы File не масштабируются.Запрос большого списка каталогов на сервере может привести к зависанию.Большие каталоги также могут вызывать проблемы с ресурсами памяти, что приводит к отказу в обслуживании.
Невозможно написать надежный код, который мог бы рекурсивно обходить файловое дерево и отвечать соответствующим образом, если были круглые символические ссылки.
Имея так много недостатков для java.io.File
, нам не нужно оснований использовать этот класс для новых разработок.
И даже для устаревшего кода, использующего java.io.File
, Oracle дает подсказки для использования Path
.
Возможно, у вас есть унаследованный код, который использует java.io.File и вы хотели бы воспользоваться функциональностью java.nio.file.Path с минимальным воздействием на ваш код.
Класс java.io.File предоставляет метод toPath, который преобразует экземпляр файла старого стиля в экземпляр java.nio.file.Path следующим образом:
Path input = file.toPath();
Вы можетезатем воспользуйтесь расширенным набором функций, доступным для класса Path.
Например, предположим, что у вас есть код, который удалил файл:
file.delete();
Вы можете изменить этот код для использования метода Files.delete следующим образом:
Path fp = file.toPath();
Files.delete(fp);