2009-08-04 54 views
5

這可能落在「不太可行」或「並不真正值得付出」的領域,但在這裏。多部分gzip文件隨機存取(以Java編程)

我想隨機訪問存儲在多部分gzip文件中的記錄。具體而言,我感興趣的文件被壓縮爲Heretrix Arc文件。 (如果你不熟悉多部分的gzip文件,使用gzip規範允許多個gzip的流在一個gzip文件並置。他們不共享任何字典信息,這是簡單的二進制追加。)

我認爲應該可以通過在文件內尋找一定的偏移量來完成此操作,然後掃描gzip魔頭標頭字節(即根據RFC,即0x1f8b),並嘗試從以下字節中讀取gzip流。這種方法的問題在於那些相同的字節也可能出現在實際數據中,因此尋找這些字節可能導致開始讀取gzip流的無效位置。考慮到記錄偏移不是先驗已知的,是否有更好的方法來處理隨機訪問?

回答

1

正如你所意識到的那樣,GZIP的設計對隨機訪問不友好。

您可以按照您的描述進行操作,然後如果遇到解壓縮程序中的錯誤,則認定您找到的簽名實際上是壓縮數據。
如果你完成了解壓縮,那麼很容易通過CRC32驗證剛解壓的流的有效性。

如果文件不是很大,可以考慮解壓縮所有的串行條目,並保留簽名的偏移量以建立一個目錄。當你解壓時,將這些字節轉儲到一個桶中。此時您將生成一個目錄,然後您可以根據文件名,日期或其他元數據支持隨機訪問。

對於100k以下的文件,這將會相當快。就像猜測一樣,如果你有10個大約100k的文件,它可能會在現代CPU上以2s完成。這就是我所說的「非常快」。但只有你知道你的應用程序的性能要求。

你有GZipInputStream類嗎?如果是這樣,你就在那裏。