Javaのディレクトリ内のファイルを一覧表示する

1. 概要

このクイックチュートリアルでは、ディレクトリ内のファイルを一覧表示するさまざまな方法について説明します*。

2. リスティング

ディレクトリ内のすべてのファイルをリストし、サブディレクトリの詳細な調査をスキップする場合は、_https://docs.oracle.com/javase/9​​/docs/api/java/io/File.html#を使用するだけです。 listFiles-[java.io.File#listFiles] _:
public Set<String> listFilesUsingJavaIO(String dir) {
    return Stream.of(new File(dir).listFiles())
      .filter(file -> !file.isDirectory())
      .map(File::getName)
      .collect(Collectors.toSet());
}

3. DirectoryStream

public Set<String> listFilesUsingDirectoryStream(String dir) throws IOException {
    Set<String> fileList = new HashSet<>();
    try (DirectoryStream<Path> stream = Files.newDirectoryStream(Paths.get(dir))) {
        for (Path path : stream) {
            if (!Files.isDirectory(path)) {
                fileList.add(path.getFileName()
                    .toString());
            }
        }
    }
    return fileList;
}
  • while _DirectoryStream_の方が速いかもしれませんが、Stream API *の一部ではなく、それを使用するのはそれほど受け入れられません。

    また、__ DirectoryStream __は、リソースを閉じる必要があります。つまり、リソースを_try-with-resources_でラップすることも必要です。

4. 歩く

または、設定済みの_depth_に__walk__ing *することで、ディレクトリ内のすべてのファイルを一覧表示できます。
https://docs.oracle.com/javase/9​​/docs/api/java/nio/file/Files.html#walk-java.nio.file.Path-java.nio.file.FileVisitOption ...を使用しましょう-[_ java.nio.file.Files#walk_]は、ディレクトリ内のすべてのファイルを特定の深さまでリストします。
public Set<String> listFilesUsingFileWalk(String dir, int depth) throws IOException {
    try (Stream<Path> stream = Files.walk(Paths.get(dir), depth)) {
        return stream
          .filter(file -> !Files.isDirectory(file))
          .map(Path::getFileName)
          .map(Path::toString)
          .collect(Collectors.toSet());
    }
}
もちろん、_try-with-resources_を使用して、remember__dir __getsのファイルハンドルが適切に閉じられるようにしてください。
または、訪問した各ファイルで何が起こるかをさらに制御したい場合は、訪問者の実装を提供することもできます。
public Set<String> listFilesUsingFileWalkAndVisitor(String dir) throws IOException {
    Set<String> fileList = new HashSet<>();
    Files.walkFileTree(Paths.get(dir), new SimpleFileVisitor<Path>() {
        @Override
        public FileVisitResult visitFile(Path file, BasicFileAttributes attrs)
          throws IOException {
            if (!Files.isDirectory(file)) {
                fileList.add(file.getFileName().toString());
            }
            return FileVisitResult.CONTINUE;
        }
    });
    return fileList;
}
これは、ファイルの読み取り、移動、または削除を追加したいときに便利です。

5. 結論

このクイックチュートリアルでは、ディレクトリ内のファイルを一覧表示するさまざまな方法を検討しました。
いつものように、例の完全なソースコードはhttps://github.com/eugenp/tutorials/tree/master/core-java-modules/core-java-io[GitHubの上]で入手できます。