Java:パスとファイル


200

Java 7で作成された新しいアプリケーションの場合、java.io.Fileオブジェクトをこれ以上使用する理由はありますか、それとも非推奨と見なすことができますか?

私はjava.nio.file.Pathできることがすべてできると信じていますjava.io.File

回答:


153

短い話:

java.io.File最も可能性が高いだろう決して非推奨しないこと/サポートされていません。そうは言っても、それjava.nio.file.Pathはより近代的なjava.nio.filelibの一部であり、java.io.Fileできることはすべて可能ですが、一般的にはより良い方法で行われます。

新しいプロジェクトの場合は、を使用しますPath

Fileレガシーのオブジェクトが必要な場合は、Path#toFile()を呼び出します。

ファイルからパスへの移行

このOracleのページのハイライトの違い、およびマップjava.io.File functionalityjava.nio.file lib (including Path) functionality

2009年5月、Janice J. HeissとSharon Zakhourによる、JDK 7のNIO.2ファイルシステムについての記事


12
違いについてのOracleのコメントは、こちらで読むことができます:docs.oracle.com/javase/tutorial/essential/io/legacy.html
Josiah Yoder

4
また、「複数形」の「ファイル」廃止されてません。これは本質的に、Pathオブジェクトを操作し、isDirectory()やexists()などの古いFileクラスの機能の多くを実行する抽象クラスです
Josiah Yoder

2
今私は疑問に思っています:なぜJavaFX 8の新しいFile / FolderChooserダイアログがそれでもFile代わりに使用するのPathですか?
パイゲーム2017

2
パスはインターフェースです。インスタンスを作成するには、Paths.get(filename)を使用します。古いAPIがまだ使用されているのは、新しいFile(filename).exists()の代わりにFiles.exists(Paths.get(filename))を記述する必要があるという混乱のためかもしれません。
Josiah Yoder

Pathで「子を追加する」resolve(...)または「1つ上のレベルに移動する」getParent()などのように簡単に変更できますが、Fileできません。基本的に、Pathの変更が完了したら、しばしばそれを変換しtoFile()て、FileInputStreamコンストラクターなどのレガシーメソッドに送信できるようにします。
MasterHD

18

非推奨と見なすことができますか?

いいえ、Javadoc でそのようにマークされるまで、非推奨と見なすことはできませんFile


14
これがこれらの「RFCがそう言っているから」と答えたとしても、私はそれを良い答えとは考えません。FileがPathに置き換えられることは明らかです。事前にしたい場合は、Pathをすぐに使い始め、必要に応じてtoFile()を使用できます。
Chris

15
@Chris 1.02でAWTイベントモデルが変更されて以来、JDKから削除されたものはありません。それは「明白」ではありません。それは間違っています。
ローンの侯爵2014

5
@downvotersこの答えは本質的にトートロジーです。それは間違いではありません。注:この回答を書いてから5年間で、Java 8が登場し、java.io.File現在も削除されておらず、廃止もされていません。Javadocには、これらのいずれかが発生することを示唆するものはまだありません。
ローン侯爵

2
@EJP私はあなたのコメントに賛成したところです。ただし、答えがトートロジーであると言ったときに、あなたが正しいかどうかは完全にはわかりません。おそらく「意見ベース」であるために押しつぶされるべきだった質問は、「非推奨と見なすことができるか」ということです。まあ、はい、OPと他の誰でもできます、そうではありません。
マイクげっ歯類2017年

@mikerodent質問が本当に何であるかを単に故意に誤解しているだけだと思います。また、部分的な引用。
ローン侯爵

8

詳細については、この記事を確認してください-http ://www.oracle.com/technetwork/articles/javase/nio-139333.html

基本的にfile.Pathはこれからの道ですが、広く知られているJavaの人々は後方互換性を保つ傾向があるので、私は彼らがそれを残した理由だと思います。


リンクを更新していただけませんか?この記事を読みたいのですが。
ジョンB

残念ながら、OracleのWebページに元の記事が見つかりませんでした。ここではウェイバックマシンからのバージョンは次のとおりです。web.archive.org/web/20090601091119/http://java.sun.com/...は
LordDoskias

1
私は通常のOracle側で記事を再び見つけました-回答へのリンクを追加しました。
ダンカンジョーンズ

5

の非常に良い答えを完成させ@mmcraeます。

java.io.Fileオブジェクトをもう使用する理由はありますか、それとも非推奨と見なすことができますか?

JDKクラスが非推奨になることはほとんどありません。JDK 8 APIの非推奨リストで、最初のJDK以降非推奨となったすべてのクラス
を確認できます。 これには、OracleのドキュメントとJavaコミュニティが使用を推奨しないクラスのほんの一部しか含まれていません。、、...それは非常に多くの欠陥を持つクラスは廃止されていないされています。 しかし、なぜ ? 概念的にはある意味がまだ存在しますが、確実に削除されるため、使用しないことをお勧めします。 何千ものプログラムが、これらの不適切に設計されたクラスに依存しています。 そのようなクラスの場合、Java API開発者はそのようなシグナルを出しません。

java.util.Datejava.util.Vectorjava.util.Hashtable

deprecated


の答え@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に関するこのOracleチュートリアルは、あなたの考えを裏付けています。

Java SE 7リリース以前は、java.io.FileクラスはファイルI / Oに使用されるメカニズムでしたが、いくつかの欠点がありました。

多くのメソッドは、失敗しても例外をスローしなかったため、有用なエラーメッセージを取得できませんでした。たとえば、ファイルの削除が失敗した場合、プログラムは「削除失敗」を受け取りますが、ファイルが存在しないためか、ユーザーに権限がないためか、その他の問題が原因であるかどうかはわかりません。

renameメソッドは、プラットフォーム間で一貫して機能しませんでした。シンボリックリンクに対する実際のサポートはありませんでした。

ファイルのアクセス許可、ファイルの所有者、その他のセキュリティ属性など、メタデータのサポートがさらに必要でした。

ファイルのメタデータへのアクセスは非効率的でした。

Fileメソッドの多くはスケーリングしませんでした。サーバーを介して大きなディレクトリリストを要求すると、ハングする可能性があります。大規模なディレクトリは、メモリリソースの問題を引き起こし、サービス不能を引き起こす可能性もあります。

循環シンボリックリンクがある場合、ファイルツリーを再帰的にウォークして適切に応答できる信頼性の高いコードを作成することはできませんでした。

には多くの欠点があるためjava.io.File、このクラスを新しい開発に使用する理由はまったくありません。
また、を使用したレガシーコードでもjava.io.File、Oracleは使用するためのヒントを提供しますPath

おそらく、java.io.Fileを使用するレガシーコードがあり、コードへの影響を最小限に抑えてjava.nio.file.Path機能を利用したいと考えています。

java.io.Fileクラスは、次のように、古いスタイルのFileインスタンスをjava.nio.file.Pathインスタンスに変換するtoPathメソッドを提供します。

Path input = file.toPath();

次に、Pathクラスで使用できる豊富な機能セットを利用できます。

たとえば、ファイルを削除するコードがあるとします。

file.delete();

次のように、Files.deleteメソッドを使用するようにこのコードを変更できます。

Path fp = file.toPath();
Files.delete(fp);

一言で言えば、彼女/彼は彼/彼女が望むなら実際にそれが非推奨であると考えることができます。
マイクげっ歯類

@マイクげっ歯類。丁度。概念的には、説明された理由により、Javadocに関してはそうではありませんが、彼女/彼はそうすべきです。
davidxxx 2018年


1

Java.io.Fileは非推奨ではありません。はいjava.nio.file.Pathの方が優れていますが、Java.io.Fileを使用するプログラムやテキストブックがまだたくさんある限り、レガシーの理由だけで非推奨と見なすべきではなく、あまりにも重要です。そうすることは、仕事にスパナを投げるだけで、全体の利益を得ることはできません。たとえば、Androidフレームワークは、基本的なファイル処理機能の一部にFileを使用しますが、他の多くのことを行います。


Pathはより良いかどうか尋ねませんでした。彼Fileは廃止されたかどうか尋ねた。
ローンの侯爵

1
@EJP私はあなたが少し過敏になっていると思います。OPはjava.io.Fileが非推奨であるかどうかを尋ね、私はそれに答えました。彼はまた、「java.nio.file.Pathはjava.io.Fileが実行できるすべてのことを実行できると信じています」と述べました。私は彼のコメントを確認しただけで、投票する価値はほとんどありませんでした。
Andrew S

-9

Java 7で作成された新しいアプリケーションの場合、java.io.Fileオブジェクトを使用する理由はありますか、それとも非推奨と見なすことができますか?

これは、「ナポレオンがロシアを侵略すべきそれともこれらのブリュッセルもやしは本当においしいのか」と言うようなものです。

質問の2番目の部分については、実際に非推奨であると考えることができます。2018年1月現在、サポートは終了していません。しかし、そう考えるのを止めることは何もありません。それがあなたにこの人生または次の人生で何らかの利点をもたらすかどうかは、言うことは不可能です。


5
私はあなたのアナロジーを理解していません。
ツナキ

「または」の質問は2つの論理的な選択肢を提示する必要があり、どちらも基本的に同じ質問に答えます。
マイクげっ歯類2017年

申し訳ありませんが、これはこのコンテキストでは非常に教訓的に聞こえます。アイデアは、「使いたいFile。はい、いいえ、どちらにしますか?」です。
Tunaki

1
ええ、私はそれがロードされた質問であることに同意します...特に、Fileとにかく多くの既存のサードパーティAPIがまだとにかく使用しているからです。すぐに死ぬことはありません。
ツナキ

3
it isn't deprecated. But there's nothing to stop you *considering* it so笑。
ドン・チードル
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.