2012-10-11 70 views
1

我已經編寫了一個爲.tar.gz文件提供服務的其餘資源。它工作正常。我試過請求它,保存數據,解壓縮它(用tar xzvf [filename]),我得到正確的數據。爲什麼我的untar不包含最後一個字節

但是,我試圖使用java.util.zip.GZIPInputStreamorg.apache.tools.tar.TarInputStream來解壓縮並解壓縮我在JUnit測試中提供的.tar.gz,以驗證它是否自動工作。這是在我的單元測試所述代碼與一些細節移除:

HttpResponse response = <make request code here> 
    byte[] receivedBytes = FileHelper.copyInputStreamToByteArray(response.getEntity().getContent(), true); 

    GZIPInputStream gzipInputStream = new GZIPInputStream(new ByteArrayInputStream(receivedBytes)); 
    TarInputStream tarInputStream = new TarInputStream(gzipInputStream); 
    TarEntry tarEntry = tarInputStream.getNextEntry(); 
    ByteArrayOutputStream byteArrayOutputStream = null; 
    System.out.println("Record size: " + tarInputStream.getRecordSize()); 
    while (tarEntry != null) // It only goes in here once 
    { 
     byteArrayOutputStream = new ByteArrayOutputStream(); 
     tarInputStream.copyEntryContents(byteArrayOutputStream); 
     tarEntry = tarInputStream.getNextEntry(); 
    } 
    byteArrayOutputStream.flush(); 
    byteArrayOutputStream.close(); 
    byte[] archivedBytes = byteArrayOutputStream.toByteArray(); 
    byte[] actualBytes = <get actual bytes> 
    Assert.assertArrayEquals(actualBytes, archivedBytes); 

最終斷言失敗,並在字節X = (n * 512) + 1的差,其中n是最大的自然數,使得n * 512 <= ll是數據的長度。也就是說,我正確地得到了512字節數據的最大可能倍數,但是調試測試我可以看到所有剩餘的字節都是零。因此,如果數據總量爲1000字節,則archivedBytes中的前512個字節是正確的,但最後488個都是零/未設置,並且如果總數據爲262272個字節,則獲得第一個262144(512 * 512)個字節正確,但其餘的字節都是零。

此外,tarInputStream.getRecordSize()上面的系統打印Record size: 512,所以我認爲這是某種程度上相關的。但是,由於檔案工程,如果我下載它,我猜數據必須在那裏,這只是我失蹤。

踏入tarInputStream.copyEntryContents(byteArrayOutputStream)與1000點字節的數據,在

int numRead = read(buf, 0, buf.length); 

numRead是100,但在看緩衝器,僅在第一512個字節爲非零。也許我不應該用這種方法從TarInputStream中獲取數據?

如果有人知道它應該如何工作,我會非常感謝任何建議或幫助。

回答

0

原來我原來的問題是錯的,並且在資源代碼中的錯誤。寫入時,我沒有關閉TarOutputStream中的條目。我猜這在從服務器手動請求時不會引起任何問題,可能是因爲該條目被連接關閉了,但是在從單元測試請求時工作方式不同......但我必須承認這並不會導致一大堆的道理是:P

望着下面我寫的代碼片段,我錯過了第3行

1: tarOutputStream.putNextEntry(tarEntry); 
2: tarOutputStream.write(fileRawBytes); 
3: tarOutputStream.closeEntry(); 
4: tarOutputStream.close(); 

我甚至不知道有這樣的事,作爲一個「 closeOutputStream上的closeEntry ...我現在就做! :P

1

您可以指定創建tar歸檔文件時要使用的輸出塊大小。因此,檔案的大小將是塊大小的倍數。由於檔案大小通常不適合整數個塊,所以將零添加到最後一個數據塊中以使其具有正確的大小。

+0

如果我得到的數據數組是數據塊大小的倍數(在這種情況下是512),並且最後一位被填充,那麼這將是有意義的。但是面對的是陣列是原始數據的長度(不是塊大小的倍數),並且從最後一個完整塊開始直到數組結束爲止。那有意義嗎?所以,這個數組不會太長,填零。這是正確的長度(預期的數據長度),但錯過了最後的數據(全零)。 –

相關問題