1. 程式人生 > >Java中檔案的兩種遞迴查詢方法

Java中檔案的兩種遞迴查詢方法

最近,需要用寫小工具來進行大量的檔案讀寫操作,不可避免的用到檔案目錄的遞迴,下面有兩種方法,一種是方法遞迴,一種是NIO的遞迴。效率應該是後一種優先,因為第一種我在學習機上跑竟然溢位了。
第一種:

File file = new File(path);
        // 如果這個路徑是資料夾
        if (file.isDirectory()) {
            // 獲取路徑下的所有檔案
            File[] files = file.listFiles();
            for (int i = 0; i < files.length; i++) {
                // 如果還是資料夾 遞迴獲取裡面的檔案 資料夾
if (files[i].isDirectory()) { System.out.println("遞迴目錄:" + files[i].getPath()); } else { System.out.println("檔案:" + files[i].getPath()); } } } else { System.out.println("檔案:" + files[i].getPath()); }

第二種:

Files.walkFileTree(p, new FileVisitor<Path>() {
        @Override
         public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException {
             System.out.println("目前分詞資料夾:" + dir);
             return FileVisitResult.CONTINUE;
         }

         @Override
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException { // System.out.println("目前分詞檔案:" + file); return FileVisitResult.CONTINUE; } @Override public FileVisitResult visitFileFailed(Path file, IOException exc) throws IOException { System.out.println("對檔案分詞失敗: " + file); return FileVisitResult.CONTINUE; } @Override public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException { return FileVisitResult.CONTINUE; } });

這這個介面的方法介紹一下:

Files.walkFileTree()

Files.walkFileTree()方法包含遞迴遍歷目錄樹的功能。walkFileTree()方法將Path例項和FileVisitor作為引數。Path例項指向您想要遍歷的目錄。FileVisitor在遍歷期間被呼叫。
看一下FileVisitor介面:

public interface FileVisitor {
    public FileVisitResult preVisitDirectory(
        Path dir, BasicFileAttributes attrs) throws IOException;

    public FileVisitResult visitFile(
        Path file, BasicFileAttributes attrs) throws IOException;

    public FileVisitResult visitFileFailed(
        Path file, IOException exc) throws IOException;

    public FileVisitResult postVisitDirectory(
        Path dir, IOException exc) throws IOException {
}

您必須自己實現FileVisitor介面,並將實現的例項傳遞給walkFileTree()方法。在目錄遍歷過程中,您的FileVisitor實現的每個方法都將被呼叫。如果不需要實現所有這些方法,那麼可以擴充套件SimpleFileVisitor類,它包含FileVisitor介面中所有方法的預設實現。
FileVisitor實現中的每個方法在遍歷過程中的不同時間都被呼叫:

在訪問任何目錄之前呼叫preVisitDirectory()方法。在訪問一個目錄之後呼叫postVisitDirectory()方法。

呼叫visitFile()在檔案遍歷過程中訪問的每一個檔案。它不會訪問目錄-只會訪問檔案。在訪問檔案失敗時呼叫visitFileFailed()方法。例如,如果您沒有正確的許可權,或者其他什麼地方出錯了。

這四個方法中的每個都返回一個FileVisitResult列舉例項。FileVisitResult列舉包含以下四個選項:

  • CONTINUE 繼續
  • TERMINATE 終止
  • SKIP_SIBLING 跳過同級
  • SKIP_SUBTREE 跳過子級

通過返回其中一個值,呼叫方法可以決定如何繼續執行檔案。
CONTINUE繼續意味著檔案的執行應該像正常一樣繼續。
TERMINATE終止意味著檔案遍歷現在應該終止。
SKIP_SIBLINGS跳過同級意味著檔案遍歷應該繼續,但不需要訪問該檔案或目錄的任何同級。
SKIP_SUBTREE跳過子級意味著檔案遍歷應該繼續,但是不需要訪問這個目錄中的子目錄。這個值只有從preVisitDirectory()返回時才是一個函式。如果從任何其他方法返回,它將被解釋為一個CONTINUE繼續。