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繼續。