編集:別の提案...
Apache Commons の実装を見ると、プロジェクトでそれを効果的にフォークするのはそれほどZipFile
難しくないように見えます。必要な APIのすべての部分を含むバイト配列の周りにラッパーを作成します(非常に多くはないと思います)。よりもインターフェースを好むことをすでに示しているので、それを使用しないのはなぜですか?RandomAccessFile
ZipFile
私たちはあなたのプロジェクトについて、これが法的な問題を引き起こすかどうかを判断するのに十分な情報を持っていません。あなたが詳細を提供したとしても、ここにいる誰かが適切な法的助言を与えることができるとは思えません.このソリューションを立ち上げて機能させるのに 1 時間か 2 時間かかりますが、あなたはそれにかなりの自信を持っていると思います。
編集:これはもう少し生産的な答えかもしれません...
エントリが連続していないことが心配であるが、すべての圧縮側を自分で処理したくない場合は、データを効果的に書き換えるオプションを検討できます。新しいByteArrayOutputStream
を作成し、最後に中央ディレクトリを読み取ります。中央ディレクトリのエントリごとに、エントリ (ヘッダー + データ) を出力ストリームに、適切と思われる形式で書き出しますZipInputStream
。次に、新しい中央ディレクトリを作成します。置換を有効にする場合は、これを最初から行う必要がある場合がありますが、実際に中央ディレクトリを読み取らないことがわかっているコードを使用している場合は、元のディレクトリを提供するだけで済みます、有効でない可能性があるという事実を無視します。正しい署名で始まる限り、おそらくそれで十分です:)
それが終わったら、をnewByteArrayOutputStream
に変換し、それを a でラップしてからorに渡します。 byte[]
ByteArrayInputStream
ZipInputStream
ZipArchiveInputStream
目的によっては、それほど多くのことを行う必要がない場合もあります。一度にディレクトリから読み取るエントリを 1 つだけ含む「ミニ」zip ファイルを作成することで、各ファイルを展開するだけでよい場合があります。 .
これにはzip ファイル形式を理解することが必要ですが、完全に理解する必要はありません。既存の API を完全に使用するような迅速かつ簡単な修正ではありませんが、それほど長くはかかりません。すべての無効なファイルを読み取れることを保証するものではありませんが (どうしてできるのでしょうか?)、特に懸念しているように思われる「エントリ間のデータ」の問題からは保護されます。それが少なくとも有用なアイデアであることを願っています...
「これが zip ファイルのバイト配列です。それを使用してください」と言う方法はありません。
はいあります:
byte[] data = ...;
ByteArrayInputStream byteStream = new ByteArrayInputStream(data);
ZipInputStream zipStream = new ZipInputStream(byteStream);
それには、ZipInputStream
あなたが提供するすべてのzipファイルを処理できるかどうかの問題が残りますが、私はそれほどすぐにそれを書き留めません.
もちろん、他の API も利用できます。たとえば、Apache Commons Compressを見たいと思うかもしれません。ZipFile
ファイルが必要ですが、そうでZipArchiveInputStream
はありません。繰り返しますが、ByteArrayInputStream
. 編集:中央ディレクトリからも読み取ってZipArchiveStream
いないようです。事前に確認しておこうと思ったmarkSupported
のですが、そうでもないようです...
編集: 質問のコメントで、zip ファイルにエントリ データを含める必要がないことをどこで読んだかを尋ねました。あなたはウィキペディアを引用しました:
「zip アーカイブを正しく読み取るツールは、zip 中央ディレクトリのさまざまなフィールドの署名をスキャンする必要があります。ファイル チャンクの開始場所を指定するのはディレクトリのみであるため、エントリをスキャンしてはなりません。スキャンは誤検出につながる可能性があります。他のデータがチャンクの間にあること、またはそのような署名を含む圧縮されていないストリームを禁止しないでください。」
これは、入力データがオプションであることと同じではありません。エントリが完全に欠落している可能性があるわけではなく、扱いにくい場所に余分なデータがある可能性があると言っています。基本的に、エントリが連続していると見なされるべきではないと言っています。ファイルの末尾にある中央ディレクトリを読み取っていない可能性があることは喜んで認めることができZipInputStream
ますが、それを行うコードを見つけることは、存在しないエントリ データに対処するコードを見つけることと同じではありません。
次に、次のように記述します。
さらに、zip が有効かどうかは気にしないことを付け加えておきます。それを扱うことです。
...これは、無効な zip ファイルを処理するコードが必要であることを示唆しています。これと組み合わせる:
これから扱うzipファイルにはまだアクセスできないので、ストリームで扱えるかどうかわかりません。
つまり、予測できない方法で無効な zip ファイルを処理するコードを求めているということです。あなたがそれを拒否することができるのは、どれほど無効である必要がありますか? ランダムな 1000 バイトを渡して、それらを zip ファイルにしようとはまったく考えていないとしたら、一体何をしますか?
基本的に、特定のライブラリが有効なソリューションであるかどうかを判断する前に、問題をより厳密に特定する必要があります。よく理解された方法で無効である可能性があるさまざまな場所から zip ファイルのセットを収集し、「これらすべてをサポートできなければならない」と言うのは理にかなっています。後で、それが十分でないことが判明した場合は、何らかの作業が必要になる場合があります。しかし、どんなに壊れていても、何でもサポートできるようにすることは、正当な要件ではありません。