Java: Шлях до файлу


200

Чи є в нових додатках, написаних на Java 7, причина більше використовувати java.io.Fileоб'єкт чи ми можемо вважати його застарілим?

Я вірю, що java.nio.file.Pathможе зробити все, що java.io.Fileможе, і більше.

Відповіді:


152

Довга коротка історія:

java.io.Fileнайімовірніше, ніколи не буде застарілим / непідтримуваним. Сказане, java.nio.file.Pathє частиною більш сучасних java.nio.fileліб, і робить все, що java.io.Fileможна, але в цілому кращим чином та іншим.

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

І якщо вам коли-небудь потрібний Fileоб’єкт для спадщини, просто зателефонуйте до Path # toFile ()

Перехід з файлу на шлях

Ця сторінка Oracle висвітлює відмінності та відображає java.io.File functionalityїхjava.nio.file lib (including Path) functionality

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


12
Ви можете прочитати коментарі Oracle щодо відмінностей тут: docs.oracle.com/javase/tutorial/essential/io/legacy.html
Йосія Йодер

4
Також зауважте, що "Файли" (у множині) не застаріли. Це, по суті, абстрактний клас, який працює на об'єктах Path і виконує багато функцій старого класу File, наприклад isDirectory () або існує ()
Josiah Yoder

2
Тепер мені цікаво: навіщо нові діалоги File / FolderChooser в JavaFX 8 потім все-таки використовуються Fileзамість Path?
piegames

2
Шлях - це інтерфейс. Щоб створити екземпляр, використовуйте Paths.get (ім'я файлу). Можливо, через старі API-інтерфейс все ще використовується Files.exists (Paths.get (назва файлу)) замість нового File (filename) .exists ().
Йосія Йодер

Pathможе бути легше модифіковано, щоб "додати дітей" за допомогою " resolve(...)або" перейти на один рівень " getParent()тощо, тоді як Fileне може. По суті, після того як ви закінчите модифікувати Шлях, ви часто конвертуєте його, toFile()щоб він міг бути відправлений у застарілі методи, такі як FileInputStreamконструктор.
MasterHD

18

чи можемо ми вважати це застарілим?

Ні, ви не можете вважати його застарілим, доки він не буде позначений на FileJavadoc.


14
Навіть якщо це одне з таких "Тому що RFC так говорить" - Відповіді, я б не вважав це гарною відповіддю. Досить очевидно, що Файл замінить Path. Якщо ви хочете випереджати час, можете негайно почати використовувати Path та використовувати toFile () там, де потрібно.
Кріс

15
@Chris Ніколи не було видалено з JDK, оскільки вони змінили модель події AWT в 1,02. Це зовсім не "очевидно". Це неправильно.
Маркіз Лорн

5
@downvoters Ця відповідь по суті є тавтологією. Це не може бути неправильним. Примітка. За п’ять років, як я написав цю відповідь, Java 8 згодом з'явилася і java.io.Fileдосі не видаляється, ані навіть застаріла, і в Javadoc все ще немає нічого, що б припустило, що будь-яка з цих речей ніколи не відбудеться.
Маркіз Лорн

2
@EJP Я просто підтримав твій коментар. Однак я не зовсім впевнений, що ти маєш рацію, коли кажеш, що відповідь - це тавтологія. Питання, яке, мабуть, повинно бути скасовано за те, що воно "ґрунтується на думці", - "чи можна вважати це застарілим"? Ну так, ОП та хто-небудь ще може , але це не так.
мійський гризун

@mikerodent Я припускаю, що це просто навмисне неправильне прочитання того, про що йдеться насправді. Також часткова пропозиція.
Маркіз Лорн

8

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

Фактично file.Path - це шлях, який потрібно пройти відтепер, але, як відомо, люди Java прагнуть зберігати сумісність, тому я думаю, саме тому вони покинули його.


Будь ласка, оновіть посилання? Я хотів би прочитати цю статтю.
Джон Б

На жаль, не вдалося знайти оригінальну статтю на веб-сторінці oracle. Ось версія із зворотної машини: web.archive.org/web/20090601091119/http://java.sun.com/…
LordDoskias

1
Я знову знайшов статтю на звичайній стороні Oracle - додано посилання для відповіді.
Дункан Джонс

5

Я завершу дуже гарну відповідь @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 та багато іншого.

Ви маєте відповідь.

Цей підручник з оракула про спадщину IO підтверджує ваше мислення.

До випуску Java SE 7 java.io.Fileклас був механізмом, використовуваним для вводу / виводу файлів, але він мав кілька недоліків.

Багато методів не кидали винятку, коли вони не вдавалися, тому неможливо було отримати корисне повідомлення про помилку. Наприклад, якщо видалення файлу не вдалося, програма отримає "помилку видалення", але не знає, чи не тому, що файл не існував, у користувача не було дозволів або виникла якась інша проблема.

Метод перейменування не працював послідовно на всіх платформах. Не було реальної підтримки символічних посилань.

Бажано отримати більшу підтримку метаданих, таких як дозволи файлів, власник файлу та інші атрибути безпеки.

Доступ до метаданих файлів виявився неефективним.

Багато методів файлів не масштабували. Запит великого списку каталогів на сервері може призвести до зависання. Великі каталоги також можуть спричинити проблеми з ресурсами пам'яті, що призведе до відмови в обслуговуванні.

Не вдалося написати надійний код, який міг би рекурсивно переходити до файлового дерева та відповідати відповідним чином, якщо були кругові символічні посилання.

Маючи стільки недоліків java.io.File, нам справді немає причин використовувати цей клас для нових розробок.
Навіть для використання застарілого коду java.io.FileOracle дає підказки щодо використання 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);

Коротше кажучи, він / він дійсно може вважати його застарілим, якщо хоче.
мійський гризун

@mike гризун. Саме так. Концептуально вона / він повинна, поки це не стосується Javadoc з пояснених причин.
davidxxx

4

Так, але багато існуючих API, включаючи власні стандартні API Java7, як і раніше працюють лише з Fileтипом.


8
Об'єкти шляху можна перетворити у файлові об'єкти за допомогою Path.toFile () , а потім використовувати стандартні API.
коктейлі

2
Отже, ваша відповідь "так, але ні"?
Маркіз Лорн

1

Java.io.File не застаріло. Так, java.nio.file.Path краще, але поки існує ще багато програм і підручників, що використовують Java.io.File, якщо це не з застарілих причин, це не слід вважати застарілим, його надто важливим. Це буде просто кидати гайковий ключ у творах без жодної вигоди. Наприклад, Android-система використовує File для деяких основних функцій обробки файлів.


Він не питав, чи Pathкраще. Він запитав, чи Fileзнецінений.
Маркіз Лорн

1
@EJP Я думаю, що ти трохи переживаєш педантичність. ОП запитав, чи не затримано файл java.io.File, і я відповів це. Він також заявив, "я вважаю, що java.nio.file.ath може зробити все, що може зробити java.io.File та багато іншого". Я просто підтверджував його коментар, навряд чи варто було проголосувати.
Andrew S

-9

Чи є в нових додатках, написаних на Java 7, будь-яка причина використовувати об’єкт java.io.File або ми можемо вважати його застарілим?

Це трохи схоже на те, що сказати: "чи повинен Наполеон вторгнутись у Росію, чи справді смачні брюссельські капуста?"

Щодо другої частини питання, то ви справді можете вважати її застарілою. Станом на січень 2018 року його не застаріло. Але ніщо не заважає вам так вважати . Чи забезпечить це вам будь-яку перевагу в цьому житті чи в наступному, сказати неможливо.


5
Я не розумію вашої аналогії.
Тунакі

Будь-яке "або" питання повинно мати дві логічні варіанти, обидві по суті відповідають одному і тому ж питанню.
мійський гризун

Вибачте, це звучить дуже педантично в цьому контексті. Ідея "Я хочу використовувати File. Я повинен, так чи ні?"
Тунакі

1
Так, я згоден, це завантажене питання ... тим більше, що багато існуючих сторонніх API все ще використовують File. Це не скоро помре.
Тунакі

3
it isn't deprecated. But there's nothing to stop you *considering* it soЛОЛ.
Дон Чедл
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.