0

データのブロックを取得し、このデータを圧縮し、最終的にそれらを 1 つの大きなバイト配列に連結するスレッドが多数あります。誰かがこのアイデアを拡張したり、別の方法を推奨したりできれば、それは素晴らしいことです. 現在、試している方法が 2 つありますが、どちらも本来の方法で機能していません。


最初の: 各スレッドのrun()関数に入力データを取得させ、それを使用GZIPOutputStreamして圧縮し、バッファに書き込みます。

ここでのこのアプローチの問題は、各スレッドが を呼び出すと、より長い完全なデータの一部であるデータのブロックを 1 つ持つため、GZIPOutputStreamその小さなブロックを圧縮する完全なデータとして扱うことです。つまり、ヘッダーとトレーラーに貼り付けられます (カスタム辞書も使用しているため、ヘッダーが現在何ビットなのか、調べる方法もわかりません)。

ヘッダーとトレーラーを手動で切り取ることができ、圧縮されたデータが残るだけだと思います(最初のブロックのヘッダーと最後のブロックのトレーラーを残します)。この方法について私が確信していないもう1つのことは、それができるかどうかです。データの最初のブロックにヘッダーを残しても、正しく解凍されますか。そのヘッダーには、データの最初のブロックのみの情報が含まれており、他の連結されたブロックの情報は含まれていませんか?


2 番目の方法は、Deflaterクラスを使用することです。その場合、入力を設定し、辞書を設定してから、 を呼び出すだけdeflate()です。

問題は、それが gzip 形式ではないことです。それは単なる「生の」圧縮データです。gzip が最終出力を認識できるようにする方法がわかりません。

4

1 に答える 1

0

他のスレッドによって呼び出される単一の GZIPOutputStream に書き込むメソッドが必要です。データが混同されないように、それらの間で適切な調整が行われます。または、スレッドに一時ファイルへの書き込みを行わせ、第 2 フェーズですべてをアセンブルして圧縮します。

于 2012-10-28T02:57:41.700 に答える