ファイル
Java SE 11 Goldにおける NIO.2 (New I/O 2) は、ファイル操作やディレクトリ走査を扱う分野です。
「従来の java.io.File クラスとの違い」と「Stream APIとの連携」が頻出ポイントとなります。
1. Pathインターフェースの操作¶
Path はファイルパスを表すオブジェクトで、**ファイルの実体が存在しなくても操作可能**なのが特徴です。
-
resolve(): パスの結合。「親パス.resolve(子パス)」で結合します。- 引数に絶対パスを渡すと、その絶対パスがそのまま返されるという「ひっかけ」に注意。
-
relativize(): 2つのパスの相対的な差異を取得します。 normalize():.(カレント)や..(親)などの冗長な記述を解消します。
試験の罠:
Pathメソッドの多くは 不変(Immutable) です。path.normalize();と呼び出しても元のpathオブジェクトは変わりません。戻り値を受け取っているか確認してください。
2. Filesクラスの主要メソッド¶
ファイルの実操作(作成、削除、コピーなど)はすべて java.nio.file.Files クラスのスタティックメソッドで行います。
-
copy(Path, Path, CopyOption...): ファイルをコピーします。- デフォルトでは上書きしません。上書きするには
StandardCopyOption.REPLACE_EXISTINGが必要です。
- デフォルトでは上書きしません。上書きするには
-
move(Path, Path, CopyOption...): ファイルを移動(またはリネーム)します。
3. Stream API を返すメソッド(重要!)¶
ここがGoldで最も狙われるポイントです。Files クラスには、戻り値として Stream<Path> を返すメソッドがいくつかあり、それらの「探索範囲」と「深さ」の違いが問われます。
| メソッド名 | 探索の深さ | 特徴 |
|---|---|---|
Files.list(Path) |
1段階のみ | 指定したディレクトリ直下のファイル・フォルダを返す。 |
Files.walk(Path, int) |
任意(再帰的) | サブディレクトリもすべて掘り進む。第2引数で深さを指定可能。 |
Files.find(Path, int, BiPredicate) |
任意(再帰的) | ファイル属性(サイズや作成日など)でフィルタリングしながら探索する。 |
Files.lines(Path) |
- | ファイルの内容を1行ずつ Stream<String> で読み出す。 |
4. ファイル属性 (FileAttributes)¶
ファイルの「読み取り専用」「隠しファイル」などの詳細情報を取得する仕組みです。
BasicFileAttributes: どのOSでも共通の属性(作成日時、サイズなど)。PosixFileAttributes: Linux/Unix特有の属性(所有者、権限など)。readAttributes(): 属性を一括で取得するメソッド。1つずつ個別に取得するより効率的です。
5. 試験対策:ここをチェック!¶
-
Symbolic Link(シンボリックリンク)の扱い
Files.walk()はデフォルトでシンボリックリンクを**たどりません**。たどるにはFollowLinksオプションが必要です。
-
例外処理
- NIO.2のメソッドのほとんどは
IOExceptionを投げます。try-catch や throws が適切に記述されているか確認してください。
- NIO.2のメソッドのほとんどは
-
ストリームのクローズ
Files.list()やFiles.lines()が返すストリームは、背後でファイルリソースを開いています。そのため、**try-with-resources文**で確実にクローズするのがベストプラクティスです。
次のステップへの提案¶
モジュールシステム、Stream API、NIO.2と、Goldの3大難所をカバーしてきました。
本番形式の「ひっかけ問題」を模したミニクイズを出してみることもできますし、あるいは残りの重要分野である 「JDBC(データベース操作)」 や 「並列処理(CyclicBarrierなど)」 について解説することも可能です。どちらに興味がありますか?