Skip to content
閲覧中:
ファイル

ファイル

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. 試験対策:ここをチェック!

  1. Symbolic Link(シンボリックリンク)の扱い

    • Files.walk() はデフォルトでシンボリックリンクを**たどりません**。たどるには FollowLinks オプションが必要です。
  2. 例外処理

    • NIO.2のメソッドのほとんどは IOException を投げます。try-catch や throws が適切に記述されているか確認してください。
  3. ストリームのクローズ

    • Files.list()Files.lines() が返すストリームは、背後でファイルリソースを開いています。そのため、**try-with-resources文**で確実にクローズするのがベストプラクティスです。

次のステップへの提案

モジュールシステム、Stream API、NIO.2と、Goldの3大難所をカバーしてきました。

本番形式の「ひっかけ問題」を模したミニクイズを出してみることもできますし、あるいは残りの重要分野である 「JDBC(データベース操作)」「並列処理(CyclicBarrierなど)」 について解説することも可能です。どちらに興味がありますか?