データのブロックを取得し、このデータを圧縮し、最終的にそれらを 1 つの大きなバイト配列に連結するスレッドが多数あります。誰かがこのアイデアを拡張したり、別の方法を推奨したりできれば、それは素晴らしいことです. 現在、試している方法が 2 つありますが、どちらも本来の方法で機能していません。
最初の: 各スレッドのrun()
関数に入力データを取得させ、それを使用GZIPOutputStream
して圧縮し、バッファに書き込みます。
ここでのこのアプローチの問題は、各スレッドが を呼び出すと、より長い完全なデータの一部であるデータのブロックを 1 つ持つため、GZIPOutputStream
その小さなブロックを圧縮する完全なデータとして扱うことです。つまり、ヘッダーとトレーラーに貼り付けられます (カスタム辞書も使用しているため、ヘッダーが現在何ビットなのか、調べる方法もわかりません)。
ヘッダーとトレーラーを手動で切り取ることができ、圧縮されたデータが残るだけだと思います(最初のブロックのヘッダーと最後のブロックのトレーラーを残します)。この方法について私が確信していないもう1つのことは、それができるかどうかです。データの最初のブロックにヘッダーを残しても、正しく解凍されますか。そのヘッダーには、データの最初のブロックのみの情報が含まれており、他の連結されたブロックの情報は含まれていませんか?
2 番目の方法は、Deflater
クラスを使用することです。その場合、入力を設定し、辞書を設定してから、 を呼び出すだけdeflate()
です。
問題は、それが gzip 形式ではないことです。それは単なる「生の」圧縮データです。gzip が最終出力を認識できるようにする方法がわかりません。