我已經編寫了一個爲.tar.gz
文件提供服務的其餘資源。它工作正常。我試過請求它,保存數據,解壓縮它(用tar xzvf [filename]
),我得到正確的數據。爲什麼我的untar不包含最後一個字節
但是,我試圖使用java.util.zip.GZIPInputStream
和org.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 <= l
和l
是數據的長度。也就是說,我正確地得到了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
中獲取數據?
如果有人知道它應該如何工作,我會非常感謝任何建議或幫助。
如果我得到的數據數組是數據塊大小的倍數(在這種情況下是512),並且最後一位被填充,那麼這將是有意義的。但是面對的是陣列是原始數據的長度(不是塊大小的倍數),並且從最後一個完整塊開始直到數組結束爲止。那有意義嗎?所以,這個數組不會太長,填零。這是正確的長度(預期的數據長度),但錯過了最後的數據(全零)。 –