使用 nio 的路径数组

Array of Path using nio

我正在研究 nio 主题并完成了以下任务: 使用 nio 递归搜索文件名。该方法应该 return 找到的路径列表。 当我 运行 下面的代码输出时,我只看到 [ ]。有人可以解释并纠正我吗?

public class Task01 {
    public static void main(String[] args) throws IOException {
        Path dir = Paths.get("C:\Users\......");
        System.out.println(findFile(dir, "Task01.java"));
    }

    public static ArrayList<Path> findFile(Path path, String filename) throws IOException {
        Path dir = Paths.get("C:\....");
        ArrayList<Path> list1 = new ArrayList<>();

        try (DirectoryStream<Path> stream = Files.newDirectoryStream(path, filename)) {
            for (Path entry : stream) {
                if (path.toFile().isDirectory()) {
                    findFile(path, filename);
                } else list1.add(entry.toAbsolutePath());
            }

        }
        return list1;
    }
}

首先,在做递归的时候,要用entry而不是path,否则你是下不了目录树的

也使用 Files.newDirectoryStream(path) 而不是 Files.newDirectoryStream(path, fileNamePattern) 第二种方法在文件名与 fileNamePattern 匹配的路径中创建一个流,在你的情况下它将是空的 [] 如果你的 Test.java 不在 path

public static void main(String[] args) throws IOException {
    Path dir = Paths.get("E:\dev\...");
    System.out.println(findFile(dir, "TestA.java"));
}

public static ArrayList<Path> findFile(Path path, String filename) throws IOException {
    ArrayList<Path> list1 = new ArrayList<>();

    try (DirectoryStream<Path> stream = Files.newDirectoryStream(path)) {
        for (Path entry : stream) {
            if (Files.isDirectory(entry)) {
               list1.addAll(findFile(entry, filename));
            } else if(entry.getFileName().endsWith(filename)){
               list1.add(entry.toAbsolutePath());
            }
        }
    }
    return list1;
}

此代码可能适合您:

public static ArrayList<Path> findFile(Path path, String filename) throws IOException {
    ArrayList<Path> list1 = new ArrayList<>();

    try (DirectoryStream<Path> stream = Files.newDirectoryStream(path,filename)) {
        for (Path entry : stream) {
            System.out.println(entry+ "-"+entry.getFileName());
            if (Files.isDirectory(entry)) {
                list1.addAll(findFile(entry, filename));
            } 
            else if (entry.getFileName().toString().equals(filename)) 
                list1.add(entry.toAbsolutePath());
        }

    }
    return list1;
}
  • 将文件名传递给 Files.newDirectoryStream(path,filename) 时,它只会搜索路径本身,不会搜索子目录。所以你可能不会在这里传递文件名来过滤。
  • 如果递归调用方法,还必须确保向上传递 return 值:list1.addAll(findFile(entry, filename));
  • 在 for 循环中始终使用 entry,而不是 path,否则您不会递归处理目录结构。 (参见 Files.isDirectory(entry) 而不是 path.toFile().isDirectory()

更新:改进了 java.nio API 的用法(感谢@Andreas)。没错,我不太熟悉 nio api.