使用nio的路径数组

问题描述

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

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)时,它将仅在路径本身中搜索,没有子目录。因此,您可能无法在此处传递文件名进行过滤。
  • 如果您递归调用方法,则还必须确保返回值向上传递:list1.addAll(findFile(entry,filename));
  • for循环内的
  • 始终与entry一起使用,而不与path一起使用,否则,您将不会递归处理目录结构。 (请参见Files.isDirectory(entry)而非path.toFile().isDirectory()

更新:改进了java.nio API的用法(由于@Andreas)。是的,我对nio api不太熟悉。