1

.tar.gzファイルを提供する残りのリソースを作成しました。正常に動作しています。私はそれを要求し、データを保存し、(でtar xzvf [filename])解凍して、正しいデータを取得しようとしました。

ただし、JUnitテストで提供しているaを使用java.util.zip.GZIPInputStreamorg.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か?

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

4

2 に答える 2

1

tar アーカイブの作成時に使用する出力ブロック サイズを指定できます。したがって、アーカイブのサイズはブロック サイズの倍数になります。通常、アーカイブのサイズはブロックの整数に収まらないため、データの最後のブロックにゼロが追加され、適切なサイズになります。

于 2012-10-11T10:41:14.270 に答える
0

元の質問で間違っていたことが判明し、エラーリソース コードにありました。書き込み時に TarOutputStream のエントリを閉じていませんでした。おそらく、エントリが接続などで閉じられたために、サーバーから手動で要求した場合、これは問題を引き起こしていなかったと思いますが、単体テストから要求された場合は別の方法で動作します...あるべき意味がたくさんあります:P

以下の記述コードの断片を見ると、3 行目が抜けていました。

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

TarOutputStream に「closeEntry」のようなものがあることさえ知りませんでした...私は今知っています! :P

于 2012-11-22T17:02:59.847 に答える