Java java.nio.file.Files list() メソッド
java.nio.file.Files.list()は Java NIO(New I/O)パッケージで提供されるユーティリティメソッドで、ディレクトリの内容を一覧表示するために使用されます。このメソッドはStream<Path>オブジェクトを返します。指定されたディレクトリ内のすべてのエントリ(ファイルとサブディレクトリ)を含みます。
メソッドの定義
public static Stream<Path> list(Path dir) throws IOException
メソッドの引数
dir パラメータ
- 型:
java.nio.file.Path - 説明:内容を一覧表示するディレクトリのパス
- 注意事項:
- パラメータがディレクトリでない場合、例外がスローされます
NotDirectoryException - パスが存在している必要があります。そうでない場合は例外がスローされます
NoSuchFileException - プログラムにディレクトリの読み取り権限がない場合、例外がスローされます
AccessDeniedException
- パラメータがディレクトリでない場合、例外がスローされます
戻り値
Stream
- 説明:ディレクトリ内のすべてのエントリ(ファイルとサブディレクトリ)を含むストリーム
- 特性:
- ストリーム内の要素は
Pathオブジェクト - ストリームは、ディレクトリ内のエントリの自然な順序(通常は名前順)で並べられます
- ストリームは遅延ロード(lazy)であり、走査時にのみ実際にディレクトリの内容が読み込まれます
- システムリソースを解放するために、ストリームを正しく閉じる必要があります
- ストリーム内の要素は
メソッドの特徴
1. 非再帰性
list()このメソッドは、指定されたディレクトリ内に直接存在するエントリのみを一覧表示し、サブディレクトリ内の内容を再帰的に一覧表示しません。
2. 特殊エントリを含まない
返されるストリームには、ディレクトリ自体(「.」)と親ディレクトリ(「..」)のエントリは含まれません。
3. リソース管理
返されるのは Stream であるため、try-with-resources 文を使用してストリームが正しく閉じられるようにすることをお勧めします:
例
try (Stream<Path> stream = Files.list(Paths.get("/path/to/dir"))) {
stream.forEach(System.out::println);
}
stream.forEach(System.out::println);
}
使用例
基本的な使い方:ディレクトリの内容を一覧表示
例
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.stream.Stream;
public class ListDirectoryExample {
public static void main(String[] args) {
Path dir = Paths.get("C:/example");
try (Stream<Path> stream = Files.list(dir)) {
stream.forEach(System.out::println);
} catch (IOException e) {
e.printStackTrace();
}
}
}
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.stream.Stream;
public class ListDirectoryExample {
public static void main(String[] args) {
Path dir = Paths.get("C:/example");
try (Stream<Path> stream = Files.list(dir)) {
stream.forEach(System.out::println);
} catch (IOException e) {
e.printStackTrace();
}
}
}
応用的な使い方:特定のファイルをフィルタリング
例
try (Stream<Path> stream = Files.list(Paths.get("/projects"))) {
stream.filter(path -> path.toString().endsWith(".java"))
.forEach(System.out::println);
} catch (IOException e) {
e.printStackTrace();
}
stream.filter(path -> path.toString().endsWith(".java"))
.forEach(System.out::println);
} catch (IOException e) {
e.printStackTrace();
}
他のコレクションへの変換
例
try (Stream<Path> stream = Files.list(Paths.get("/images"))) {
List<Path> imageFiles = stream.collect(Collectors.toList());
// 収集されたファイルリストを処理する
} catch (IOException e) {
e.printStackTrace();
}
List<Path> imageFiles = stream.collect(Collectors.toList());
// 収集されたファイルリストを処理する
} catch (IOException e) {
e.printStackTrace();
}
例外処理
Files.list()このメソッドは次の例外をスローする可能性があります:
- NotDirectoryException- パスがディレクトリでない場合
- NoSuchFileException- ディレクトリが存在しない場合
- SecurityException- ディレクトリの読み取り権限がない場合
- IOException- その他の I/O エラーが発生した場合
パフォーマンスの考慮
- 遅延ロード:ストリームは遅延ロードであり、forEach などの終端操作が実行されたときにのみ実際にディレクトリが読み込まれます
- リソース消費:大量のファイルを含むディレクトリの場合、ストリームを使用するとすべてのエントリを一度にメモリに読み込むことを避けられます
- 並列処理:呼び出すことができます
parallel()メソッドを使用して並列処理を実現できますが、スレッドセーフティに注意する必要があります
類似メソッドとの比較
| メソッド | 戻り値の型 | 再帰性 | 特殊エントリを含む | 備考 |
|---|---|---|---|---|
Files.list() |
Stream<Path> |
否 | 否 | 推奨、リソースに優しい |
File.listFiles() |
File[] |
否 | 否 | 従来の IO メソッド |
Files.walk() |
Stream<Path> |
である | である | すべての内容を再帰的に一覧表示 |
Files.newDirectoryStream() |
DirectoryStream<Path> |
否 | 否 | 手動で閉じる必要があります |
ベストプラクティス
- 常に try-with-resources を使用する:ストリームが正しく閉じられることを確認します
- 例外を処理する:可能性のある IOException を適切に処理します
- フィルタの使用を検討する:ストリーム操作で不要なエントリをできるだけ早くフィルタリングします
- ディレクトリの変更を避ける:ディレクトリを走査するときに、その内容を変更しないでください
- シンボリックリンクに注意する:デフォルトではシンボリックリンクに従うため、循環参照が発生する可能性があります
まとめ
Files.list()このメソッドは現代的で、Java NIO でディレクトリの内容を処理し、遅延実行、チェーン操作、並列処理能力など、ストリーム API のすべての利点を提供します。単純なディレクトリ一覧のニーズに対しては、従来のFile.listFiles()メソッドよりも柔軟で効率的です。