FileもPathも, ファイルシステム上のノードを表しているには違いないのだが, 大きな違いがある. 前者が, デフォルトファイルシステム(そのOSのローカルファイルシステムのこと)中のノードを表しているのに対して, 後者がもっと抽象的な仮想ノードを表していることだ. 実際, Fileは具象だが, Pathはinterfaceである. Pathは, Fileの設計失敗を反省して設計された.
NIO2のFilesystem, FilesystemProviderはまさに, 抽象的なファイルシステムを表すためにある. これらは, FUSEに似ている. だから, FUSEにあるように, S3をバックエンドにしたファイルシステムなども実装可能である.
今日のTip:
- 新しく作るコードでは, Pathを使うべき
- File#toPathは使ってもいいが, Path#toFileを使うとファイルシステムがデフォルトに固定されることになる. これは以下のような問題を生む. 結果, デフォルトファイルシステムに依存したコードが混入している可能性を排除出来なくなる. ポータビリティをあげたいのであれば, Pathを使わなければいけない.