2016-01-21 44 views
1

所以我「聽說」在Java 7中引入的DirectoryStream比傳統的目錄列表方法更快。但是,我不是這種情況。列出整個目錄可能會更快,但是在過濾文件和只接受文件夾時,需要更多時間。舉例來說,這些是代碼:爲什麼File :: listFiles比DirectoryStream更快 - 只接受目錄

使用File

ArrayList<File> tempArray = new ArrayList(); 
for (File file : someFile.listFiles()){ 
    if(!file.isDirectory()) 
     continue; 
    tempArray.add(file); 
} 

DirectoryStream使用:

DirectoryStream<Path> stream = null; 
try { 
    stream = Files.newDirectoryStream(dir, new DirectoryStream.Filter<Path>() { 
      public boolean accept(Path file) throws IOException { 
       return Files.isDirectory(file); 
      } 
     }); 
} catch (IOException ex) { 
} 

ArrayList<File> files = new ArrayList(); 
for (Path path : stream) 
    files.add(path.toFile()); 
stream.close(); 

第二種方法(使用DirectoryStream)是更慢。我知道兩種方法檢查每個文件,看看它的目錄。或者是因爲DirectoryStream已同步(如果錯誤,再次糾正我)?

回答

1

那麼,在第二種情況下,你要測試兩次路徑是目錄。此外,你實際上正在定義一個新的類,它有一個相對較大的首次使用成本。

+0

對不起,實際上這個代碼是從原始代碼中提取的,所以我必須在手動再次寫入時意外添加了兩次檢查;在任何情況下,我都不會檢查''directory()''。對於你的第二點,你在談論「新的DirectoryStream.Filter」嗎? –

1

這是由於您在DirectoryStream中使用filter謂詞造成的,帶謂詞的Stream比收集慢。您可以通過驗證:

Stream.of(file.listFiles()).filter(f -> f.isDirectory()).collect(Collectors.toList()) 

現在,你可以看到,DirectoryStreamlistFiles更快。

因此,根本原因不是關於DirectoryStreamlistFiles,它是您使用Streamfilter predicate

相關問題