Java 7: путь против файла - PullRequest
       46

Java 7: путь против файла

183 голосов
/ 01 августа 2011

Для новых приложений, написанных на Java 7, есть ли причина использовать объект java.io.File больше или мы можем считать его устаревшим?

Я считаю, что java.nio.file.Path может сделать все, что может java.io.File и даже больше.

Ответы [ 7 ]

137 голосов
/ 30 октября 2014

Короче говоря:

java.io.File, скорее всего, никогда не будет устареть / не поддерживаться. Тем не менее, java.nio.file.Path является частью более современной java.nio.file lib и делает все, что может java.io.File, но в целом лучше и больше.

Для новых проектов используйте Path.

И если вам когда-либо понадобится File объект для устаревшего, просто вызовите Path # toFile ()

Миграция из файла в путь

Эта страница Oracle выделяет различия и отображает java.io.File functionality в java.nio.file lib (including Path) functionality

Статья Дженис Дж. Хейс и Шарон Захур, май 2009 г., посвященная обсуждению файловой системы NIO.2 в JDK 7

16 голосов
/ 02 августа 2011

можем ли мы считать его устаревшим?

Нет, вы не можете считать его устаревшим, если и до тех пор, пока он не будет помечен в File Javadoc.

7 голосов
/ 01 августа 2011

Проверьте эту статью о дополнительной информации - http://www.oracle.com/technetwork/articles/javase/nio-139333.html

По сути, file.Path будет таким способом, но, как известно, Java-люди склонны сохранять обратную совместимость, поэтому я думаю, именно поэтому они оставили его.

4 голосов
/ 02 августа 2011

Да, но многие существующие API, включая собственные стандартные API Java7, все еще работают только с типом File.

3 голосов
/ 17 января 2018

Я завершу очень хороший ответ @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);
1 голос
/ 08 августа 2017

Java.io.File не рекомендуется.Да, java.nio.file.Path лучше, но пока есть много программ и учебников, использующих Java.io.File, хотя бы по устаревшим причинам, его не следует считать устаревшим, это слишком важно.Это просто бросило бы гаечный ключ в работу без всякой выгоды.Например, платформа Android использует File для некоторых основных функций обработки файлов, многие другие вещи делают.

0 голосов
/ 05 марта 2017

Для новых приложений, написанных на Java 7, есть ли какая-либо причина использовать объект java.io.File больше или мы можем считать его устаревшим?

Это немного похоже наговоря: "должен ли Наполеон вторгаться в Россию, или действительно ли эти брюссельские капусты действительно вкусны?",По состоянию на январь 2018 года, он не является устаревшим.Но ничто не остановит вас , учитывая это так.Невозможно сказать, принесет ли это вам какое-либо преимущество в этой жизни или в следующей.

...