.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か?
誰かがそれがどのように機能するのかを知っていれば、アドバイスや助けにとても感謝しています.