Java SE 7よりも前のリリースでは、ファイルI/Oのメカニズムとしてjava.io.Fileクラスが使用されていましたが、このクラスには以下のようないくつかの欠点があります。
renameメソッドの動作が、プラットフォーム間で一貫していない。
Fileの多くのメソッドにスケーラビリティがない。 大きなディレクトリのリスト作成をサーバーにリクエストすると、ハングすることがある。 大きなディレクトリによってメモリ・リソースの問題が発生し、結果としてサービスが拒否されることがある。
旧来のコードでjava.io.Fileを使用していて、そのコードへの影響を最小限に抑えつつjava.nio.file.Pathの機能を活用したいとお考えではないでしょうか。
java.io.FileクラスにはtoPathメソッドが用意されています。このメソッドを次のように使用すると、古いスタイルのFileインスタンスを、java.nio.file.Pathインスタンスに変換できます。
Path input = file.toPath();
これにより、Pathクラスの豊富な機能セットを活用できるようになります。
たとえば、ファイルを削除する次のようなコードがあるとします。
file.delete();
このコードは、Files.deleteメソッドを使用して次のように変更できます。
Path fp = file.toPath(); Files.delete(fp);
これとは逆に、Path.toFileメソッドは、Pathオブジェクトを表すjava.io.Fileオブジェクトを構成します。
ファイルI/OのJava実装はJava SE 7リリースで完全に再構築されたため、メソッドを他のメソッドに単純に入れ替えるということはできません。 java.nio.fileパッケージの豊富な機能を使用するには、前述のとおり、File.toPathメソッドを使用する方法がもっとも簡単です。 ただし、この方法の使用が望ましくない場合や、この方法ではニーズを満たせない場合は、ファイルI/Oコードを再記述する必要があります。
java.io.File APIとjava.nio.file APIには、1対1の対応関係はありませんが、次の表に、この2つのAPI間の機能の対応関係に関する一般的な考え方と詳細情報の参照先を示しています。
| java.io.File機能 | java.nio.file機能 | チュートリアルの関連セクション |
|---|---|---|
java.io.File |
java.nio.file.Path |
Pathクラス |
java.io.RandomAccessFile |
SeekableByteChannelの機能 |
ランダム・アクセス・ファイル |
File.canRead、canWrite、canExecute |
Files.isReadable、Files.isWritable、Files.isExecutable UNIXファイル・システムでは、ファイル属性パッケージを使用して9つのファイル権限を確認 |
ファイルやディレクトリのチェック メタデータの管理 |
File.isDirectory()、File.isFile()、File.length() |
Files.isDirectory(Path, LinkOption...)、Files.isRegularFile(Path, LinkOption...)、Files.size(Path) |
メタデータの管理 |
File.lastModified()、File.setLastModified(long)
| Files.getLastModifiedTime(Path, LinkOption...)、Files.setLastMOdifiedTime(Path, FileTime)
| メタデータの管理 |
さまざまな属性を設定するFileのメソッド: setExecutable、setReadable、setReadOnly、setWritable |
FilesのsetAttribute(Path, String, Object, LinkOption...)メソッドに置換
|
メタデータの管理 |
new File(parent, "newfile") |
parent.resolve("newfile") |
パス操作 |
File.renameTo |
Files.move |
ファイルやディレクトリの移動 |
File.delete |
Files.delete |
ファイルやディレクトリの削除 |
File.createNewFile |
Files.createFile |
ファイルの作成 |
File.deleteOnExit |
createFileメソッドで指定するDELETE_ON_CLOSEオプションに置換 |
ファイルの作成 |
File.createTempFile |
Files.createTempFile(Path, String, FileAttributes<?>)、Files.createTempFile(Path, String, String, FileAttributes<?>)
|
ファイルの作成 ストリームI/Oを使用したファイルの作成と書込み チャネルI/Oを使用したファイルの読取りと書込み |
File.exists |
Files.exists、Files.notExists |
ファイルまたはディレクトリの存在チェック |
File.compareTo、equals |
Path.compareTo、equals |
2つのパスの比較 |
File.getAbsolutePath、getAbsoluteFile |
Path.toAbsolutePath |
パスの変換 |
File.getCanonicalPath、getCanonicalFile |
Path.toRealPathまたはnormalize |
パスの変換(toRealPath)パスの冗長部分の削除( normalize) |
File.toURI |
Path.toURI |
パスの変換 |
File.isHidden |
Files.isHidden |
パスに関する情報の取得 |
File.list、listFiles |
Path.newDirectoryStream |
ディレクトリの内容リストの取得 |
File.mkdir、mkdirs |
Path.createDirectory |
ディレクトリの作成 |
File.listRoots |
FileSystem.getRootDirectories |
ファイル・システムのルート・ディレクトリ・リストの取得 |
File.getTotalSpace、File.getFreeSpace、File.getUsableSpace |
FileStore.getTotalSpace、FileStore.getUnallocatedSpace、FileStore.getUsableSpace、FileStore.getTotalSpace |
ファイル・ストア属性 |