Javaでファイル操作を行う方法には、古くからあるjava.io.File
と、Java 7以降に登場したjava.nio.file.Path
を中心としたNIO.2のAPIがあります。
本記事では、それぞれの違いを明確にしながら、「今なぜPathを使うべきなのか?」を解説します。
なぜいまPath(NIO)が注目されるのか?
Javaは長らくjava.io.File
を使ってファイルやディレクトリを操作してきました。しかし、File
は以下のような課題を抱えていました。
- 例外が発生せず、戻り値で処理を分岐する設計
- シンボリックリンクへの対応が不十分
- ファイル属性の取得が限定的
Java 7で登場したNIO.2(New Input/Output API)では、これらの課題を解決するためにPath
やFiles
といった新しいクラスが導入され、より直感的で堅牢なファイル操作が可能になりました。
FileとPathの徹底比較
比較項目 | java.io.File | java.nio.file.Path / Files |
---|---|---|
導入時期 | Java 1.0 | Java 7(NIO.2)以降 |
可読性・記述の簡潔さ | △ | ◎ |
シンボリックリンクの扱い | × | ◎ |
ファイル属性の取得 | 限定的 | 豊富(POSIX, Basic, etc) |
ファイル監視(WatchService) | × | ◎ |
拡張性 | △ | ◎ |
【実例】FileとPathのコード比較
ファイルの存在確認と削除
File版:
File file = new File("example.txt");
if (file.exists()) {
file.delete();
}
Path + Files版:
Path path = Path.of("example.txt");
Files.deleteIfExists(path);
Files
を使うことで、コードがより明確で読みやすくなっています。
テキストファイルの読み書き
書き込み:
Path path = Path.of("output.txt");
Files.writeString(path, "こんにちは、Java NIO!");
読み込み:
String content = Files.readString(path);
System.out.println(content);
わずか数行で、安全かつ効率的なファイル操作が可能です。
Pathを使うことで得られる3つのメリット
1. 安全性
例外ベースで処理を行うため、失敗の原因を明示的に扱えます。エラーの隠蔽が少なく、堅牢なコードが書けます。
2. 拡張性
POSIX属性、タイムスタンプ、ファイルシステムの種類など、詳細な情報にアクセスできます。NIOのカスタムファイルシステムも使えます。
3. 将来性
今後のJava開発における標準APIであり、各種ライブラリもPath
ベースに移行しています。
どんなときにFileを使うべき?
完全にFile
が不要になったわけではありません。以下のようなケースではまだ使用価値があります。
- 既存のコードベースが
File
に依存している - 非常に単純なファイル名の取得や存在確認
- 古いライブラリやAPIとの互換性が必要な場合
ただし、これらも徐々にPath
ベースへ移行すべきです。
まとめ:新しいJavaではPathを選ぼう
Javaでのファイル操作は、今やjava.nio.file.Path
とFiles
が主流です。
よりモダンで安全、そして柔軟なコードを書くためには、NIO.2を活用するのがベストプラクティスです。
新しい開発では迷わずPathを使い、レガシーコードも段階的にリファクタリングしていきましょう。