2013-08-23 48 views
2

我有一個超過100K文件的目錄,我想爲每個文件執行一些功能。現在,我使用File.listFiles()要做到這一點,但是這是非常低效的,因爲:列出目錄中的Java文件

  1. 發生前的任何處理,造成不必要的長掛的所有文件名必須讀取。
  2. 所有文件名最終被放入數組中,佔用大量內存。在任何時候,我只需要足夠的內存來存儲一個文件名,但在這裏我總是需要足夠的內存來存儲所有文件名。

我真正想要的東西就像一個UNIX目錄句柄,但我找不到像這樣的東西。我還查找了OpenJDK中的File.listFiles()究竟如何,但它最終的結果是native function call for UNIX-based systems (line 268)for Windows (line 525)。更糟糕的是,本地調用預計會返回數組。

我想避免插入JNI或調用外部程序,如果可能的話。

回答

4

如果您使用的是Java 7,NIO2的新路徑獲得一個目錄作爲流的文件(如迭代器)

try (DirectoryStream<Path> stream = Files.newDirectoryStream(dir)) { 
    for (Path file: stream) { 
     System.out.println(file.getFileName()); 
    } 
} catch (IOException | DirectoryIteratorException x) { 
    // IOException can never be thrown by the iteration. 
    // In this snippet, it can only be thrown by newDirectoryStream. 
    System.err.println(x); 
} 

退房教程:http://docs.oracle.com/javase/tutorial/essential/io/dirs.html#listdir

0

您可以使用Java 7 FileVisitorFiles.walkFileTree()

Files.walkFileTree(Paths.get("/your/path"), new SimpleFileVisitor<Path>() { 
    @Override 
    public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException { 
     // do what you want with the file 
     return FileVisitResult.CONTINUE; 
    } 
    // more methods to override going through directories 
}); 

走路的每個文件,目錄或符號鏈接(如果你想),一次一個。它在內部使用DirectoryStream<Path>