我想快速高效地列出包含在單個目錄中的大量文件(10,20,000左右)。 我已經閱讀了不少帖子,特別是在這裏解釋了Java的短暫實現,主要由於底層文件系統(可能Java 7對此有一些答案)。 這裏的一些帖子提出了諸如本地調用或管道等替代方案,並且我明白在正常情況下最好的選項是java調用 - String [] sList = file.list();這隻比file.listFiles()稍微好點; 此外,還有一個使用多線程(也是Executor服務)的建議。Java:從單個目錄中列出所有文件(10-20,000 +)
那麼,這裏的問題是我很少有如何編碼多線程方式的實用知識。所以我的邏輯必然是錯誤的。不過,我想是這樣的:
- 創建的對象
- 然此列表的環數線程的列表,稱爲。開始(),並立即。睡眠(500)
- 在線程類,過度騎着運行methos到包括.LIST()
這樣的事情,主叫類 -
String[] strList = null;
for (int i = 0; i < 5; i++){
ThreadLister tL = new ThreadLister(fit);
threadList.add(tL);
}
for (int j = 0; j < threadList.size(); j++) {
thread = threadList.get(j);
thread.start();
thread.sleep(500);
}
strList = thread.fileList;
和Thread類作爲 -
public String[] fileList;
public ThreadLister(File f) {
this.f = f;
}
public void run() {
fileList = f.list();
}
我可能會離開這裏與多線程,我想這一點。 我非常感謝我的多線程要求的解決方案。額外的好處是我會學習更多關於實用多線程。
查詢更新
那麼,顯然多線程是不是要幫我(以及我現在認識到它並不是一個真正的解決方案)。感謝您幫助我排除線程。
所以我試過了,
1. FileUtils.listFiles()
來自apache commons--差別不大。
2.本地電話即, exec("cmd /c dir /B .\\Test")
- 這裏執行速度很快,但是當我使用需要時間的while循環讀取Stream時。
實際上我需要的是文件名,取決於單個目錄中大約100k個文件中的某個過濾器。所以我使用像File.list(new FileNameFilter())
。
我相信FileNameFilter沒有任何好處,因爲它會嘗試首先匹配所有文件,然後發出輸出。
是的,據我所知,我需要一種不同的方法來存儲這些文件。我可以嘗試的一個選擇是將這些文件存儲在多個目錄中,但我還沒有嘗試過(我不知道這是否會有所幫助) - 正如鮑里斯之前提出的。
還有什麼可以是一個更好的選擇,在Unix上的本地調用ls與文件名匹配有效地工作。我知道在Windows上它不工作,我的意思是,除非我們在同一個目錄正在尋找
親切的問候
我也懷疑使用多線程將會有所幫助,因爲沒有辦法告訴「list()」方法從哪裏開始列出文件,所以你最終會重新創建列表多次。 – camickr 2010-12-10 16:25:53
看來你必須退一步,重新思考將多個文件存儲在一個目錄中的實現。例如,看看蘋果如何用他們的iPod解決了這個問題。有大約50個用於保存文件的文件夾。 – 2010-12-10 16:29:14
@camickr - 是的,當我試圖運行此程序時,它確實多次顯示列表長度。 – 2010-12-10 16:46:29