.tar.gz
ファイルを提供する残りのリソースを作成しました。正常に動作しています。私はそれを要求し、データを保存し、(でtar xzvf [filename]
)解凍して、正しいデータを取得しようとしました。
ただし、JUnitテストで提供しているaを使用java.util.zip.GZIPInputStream
しorg.apache.tools.tar.TarInputStream
て解凍および解凍して、自動的に機能していることを確認しようとしています。.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);
最後のアサートは、 byte の差で失敗しますX = (n * 512) + 1
。ここで、n
はそのような最大の自然数でn * 512 <= l
ありl
、 はデータの長さです。つまり、512 バイトのデータの可能な限り最大の倍数を正しく取得しますが、テストをデバッグすると、残りのバイトはすべてゼロであることがわかります。したがって、データの合計量が 1000 バイトの場合、最初の 512 バイトarchivedBytes
は正しいですが、最後の 488 バイトはすべてゼロ/未設定であり、合計データが 262272 バイトの場合、最初の 262144 (512*512) バイトが正しく取得されます、しかし残りのバイトは再びすべてゼロです。
また、tarInputStream.getRecordSize()
上記の System out は を出力Record size: 512
するので、これは何らかの形で関連していると思います。ただし、アーカイブはダウンロードすれば機能するので、データがそこにあるに違いないと思います。何かが足りないだけです。
tarInputStream.copyEntryContents(byteArrayOutputStream)
1000 バイトのデータで にステップインすると、
int numRead = read(buf, 0, buf.length);
これnumRead
は 100 ですが、バッファを見ると、最初の 512 バイトだけが非ゼロです。たぶん、そのメソッドを使用してデータを取得するべきではありませんTarInputStream
か?
誰かがそれがどのように機能するのかを知っていれば、アドバイスや助けにとても感謝しています.