2012-05-17 30 views
0

我不是Java專家,但我正在編寫的程序將處理高吞吐量。所以我認爲我會爲觀點尋找一點點人羣。這是情況。檢查Java中匹配文件的有效方法

java進程將會看一個文件目錄進行處理,這些文件將被配對(要被存儲的數據文件和要被編目的元信息的xml文件)。所以我需要獲取當前文件列表,檢查所需的雙胞胎,然後進行處理。

文件將始終具有匹配的文件名,並且僅在文件擴展名方面有所不同,例如, filename1.jpg filename1.xml filename2.jpg filename2.xml

我有三種選擇,我想的那麼遠。

  1. 使用FilenameFilter用的File.List(的FilenameFilter)調用,以檢查是否有文件名文件總數大於1

  2. 使用兩filenamefilters生成的文件以.XML和不帶列表.xml,將非XML文件列表轉換爲ArrayList並調用Collections.binarySearch()。

  3. 生成所有不帶.xml擴展名的文件的列表,使用此列表作爲基於文件名假定.xml文件的鍵/值對的哈希表的鍵。然後運行哈希列表並在處理之前檢查.xml孿生子的存在。

有什麼想法?

EDITS /評論

看的建議和他的動手我現在使用兩個FilenameFilters,一個列出了XML文件和一個不打算之後。 XML文件列表被剝離了xml擴展名並轉儲到散列表中。然後迭代數據文件列表,在繼續之前調用hashlist.contains()以查看哈希集中是否存在匹配。

下面提到處理不完整文件的問題。正如我在評論中所說的,我認爲新寫入的文件在非寫入過程中不可見,直到寫入完成(新文件,未打開進行編輯)

回答

3

獲取所有文件,排序他們,然後運行對文件名稱進行線性傳遞並查看哪些符合前綴。顯然,它們應該在排序列表中緊挨着。

這應該比過濾器和hashmaps更簡單快捷!

要監視目錄,您可能需要使用通知庫API,例如inotify(如果可用)。然後OS會在文件夾內容發生變化時發出信號。

+0

+1:明顯的解決方案比我的更好。 –

0

這是有點偏離主題,但我希望充分相關的張貼在這裏,給出意圖陳述。

該問題沒有說明文件如何到達目錄中。如果他們通過網絡或互聯網進入,或從另一個進程流入,則傳送可能不是即時的,導致選擇和處理尚未完全傳送的文件的風險,例如,一半的jpeg文件。

如果你有高吞吐量,那麼如果你允許的話,這是一種會發生的情況。即使你在處理之前暫時延遲,它也許遲早會以某種方式發生。

解決這個問題的一個常用策略是傳遞到中間文件名(或更好的是,相鄰的文件夾)。交貨完成後,交貨過程會重命名或移動文件到正確的名稱和位置。此舉實際上是即時的(原子)。在ftp的情況下,至少有一個衆所周知的工具會自動執行這些步驟。

它也許就話題一提的是,如果你的部分交付的文件是在同一文件夾中,只有一個備用文件擴展名重命名,這可能對一些有關此問題提到的選項的軸承。

+0

我是在這樣的假設下,因爲這些文件正在寫入新的操作系統將不會顯示該文件作爲存在,直到寫入完成。也就是說,同時拷貝/寫上目錄中的一個新的文件發生的事情,不執行該寫入任何進程不能看到它時,他們查詢目錄爲它的當前文件。如我錯了請糾正我。 – FaultyJuggler

+0

實際上,我知道的任何操作系統都會在創建時顯示文件,而不是在關閉時(完成寫入)。這就是爲什麼寫入臨時文件(或臨時文件夾)是最佳做法,然後在完成時將文件移動到最終名稱。 –