2014-01-26 64 views
1

我正在使用Apache Commons Compress庫來迭代.tar.gz文件。我的問題是,如果我使用.getNextTarEntry()迭代tar文件,我可以始終假定tarArchiveEntry對象是以前的條目的後代,它們是目錄。我無法用簡單的英語解釋這個所以這裏是代碼示例:使用java迭代tar.gz文件

try (
        FileInputStream fileInputStream = new FileInputStream(tarFile); 
        GZIPInputStream gzipInputStream = new GZIPInputStream(fileInputStream); 
        TarArchiveInputStream tarArchiveInputStream = new TarArchiveInputStream(gzipInputStream);) { 

       TarArchiveEntry tarArchiveEntry; 

       while (null != (tarArchiveEntry = tarArchiveInputStream.getNextTarEntry())) { 
        if (tarArchiveEntry.isDirectory()) { 
         currentDirEntry = tarArchiveEntry 
        } else { 
         //Is tarAchiveEntry always "child" of currentDirEntry 
        } 
       } 
      } 

我的問題是我處理龐大的名爲.tar.gz文件(幾個GB大,含> 100K文件)和我不想爲每個單個文件解析父目錄名(它們包含重要信息)。我只想解析目錄名一次,並假設所有的下一個條目都是這個目錄的子目錄。如果我打到下一個目錄,那麼這個過程從一開始就開始。

我不能使用DIY的方法,因爲我不確定什麼會影響創建.tar.gz文件時的文件順序,但由於tar格式不包含任何索引(據我所知?),它會使感覺到目錄條目在它們的內容之前被列出。

任何幫助表示讚賞。

回答

1

由於tar檔案沒有索引,commons-compress無法確定最近解壓目錄中的其他文件是否稍後會出現(不解壓整個文件)。因此,你的問題是關於壓縮程序的行爲,而不是你的解壓縮程序。

通常,對tar文件中條目的順序沒有限制(甚至是它們的唯一性 - 稍後的條目可能會覆蓋更早的條目)。我的命令行tar會按照文件在命令行上傳遞的順序將文件打包到歸檔文件中,因此我可以像a/foo b/bar a/baz b/quux那樣進行替換,這就是它們的打包順序。例如,我可能會這樣做,以保持相似性在檔案中彼此鄰近的文件,以利用基於字典(滑動窗口)算法如gzip進行更好的壓縮。

只有當您具有創建您正在處理的文件的存檔器的特殊知識時,纔可以假定目錄中的所有文件都連續列出在tar存檔中。