2

ユーザーがファイルを圧縮および解凍できるようにするアプリケーションをAndroidで作成し、パッケージを使用しましたjava.util.zip。すべてが大丈夫です。速度、ファイルは完全に圧縮され、ディレクトリと一緒に解凍されます。唯一の問題は、アプリケーションが大きなファイル(1GBを超える)を圧縮/解凍できないことです。

問題は私のサイズだと思いbufferます。私が見た他のコードでは、それらのバッファーの値は1024または2048または8192ですが、私のバッファーの値は、選択したファイルのサイズに基づいています(柔軟性を持たせるため)。しかし、ユーザーが大きなファイル(8桁を超えるサイズ)を選択すると、エラーが発生します。ネットやこのサイトで検索しましたが、答えが見つかりません。私の問題はこれに似ています:

大きなファイルをJavaでZIPに圧縮するには

今後ともよろしくお願いいたします。:)

編集:

コメントと回答をありがとう。それは本当に大いに役立ちました。Javaでの圧縮/解凍はファイルのサイズを意味すると思っBUFFERたので、私のプログラムでは、バッファサイズを柔軟にしました(バッファサイズ=ファイルサイズ)。バッファがどのように機能するかを誰かに説明してもらえますか?BUFFER固定値を使用しても問題がない理由を理解できます。また、バッファサイズが8kかそれ以外の場合は、他の人がはるかに優れていると言っている理由を理解するためにも。どうもありがとう!:)

4

2 に答える 2

5

バッファのサイズをファイルのサイズにすると、ファイルサイズがメモリに対して大きすぎる場合は常にOutOfMemoryErrorが発生することを意味します。

通常のバッファサイズを使用して、それを機能させます-一度にすべてではなく、一度に1つのチャンクでストリーミング方式でデータをバッファリングします。

説明については、たとえばBufferedOutputStreamのドキュメントを参照してください。

このクラスは、バッファリングされた出力ストリームを実装します。このような出力ストリームを設定することにより、アプリケーションは、書き込まれるバイトごとに基になるシステムを呼び出すことなく、基になる出力ストリームにバイトを書き込むことができます。

したがって、バッファを使用する方が、バッファなしの書き込みよりも効率的です。

そして、writeメソッドから:

通常、このメソッドは、指定された配列からのバイトをこのストリームのバッファーに格納し、必要に応じて、基になる出力ストリームにバッファーをフラッシュします。ただし、要求された長さが少なくともこのストリームのバッファーと同じ大きさである場合、このメソッドはバッファーをフラッシュし、基になる出力ストリームにバイトを直接書き込みます。

書き込むたびに、バッファがいっぱいになるまで、メモリ内のバッファがいっぱいになります。バッファがいっぱいになると、フラッシュされてクリアされます。非常に大きなバッファを使用すると、フラッシュする前に大量のデータがメモリに保存されます。バッファが入力ファイルと同じサイズの場合、フラッシュする前にコンテンツ全体をメモリに読み込む必要があると言っています。通常、デフォルトのバッファサイズを使用しても問題ありません。より多くの物理的な書き込み(フラッシュ)があります。あなたは記憶を爆発させないようにします。

APIを使用すると、特定のバッファサイズを指定できるため、アプリケーションに合わせてメモリ消費量とI/Oの適切なバランスを選択できます。アプリケーションのパフォーマンスを調整すると、バッファサイズが微調整される可能性があります。ただし、デフォルトのサイズは多くの状況で妥当です。

于 2012-06-19T09:33:45.263 に答える
1

次のように、バッファの最大サイズを設定するだけでよいようです。

//After calculating the buffer size bufSize:
bufSize = Math.min(bufSize, MAXSIZE);
于 2012-06-19T09:35:06.150 に答える