簡體   English   中英

使用 nio 的路徑數組

[英]Array of Path using nio

我只是在學習主題 nio 並完成了以下任務:使用 nio 遞歸搜索文件名。 該方法應該返回一個找到的路徑列表。 當我在輸出中運行下面的代碼時,我只看到[] 有人可以解釋並糾正我嗎?

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我對nio api 不太熟悉。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM