2012-01-17 15 views
0

URLを使用して比較的小さい.zipファイルを取り出し、それを一時ディレクトリに保存し、ローカルマシンに解凍してファイルの一部を変更します。これはすべて素晴らしいです。Java:入力ストリームの大きなファイルの処理

しかし、私は次のようにBufferedInputStream経由.zipファイルにアクセスしています:

Url url = "http://somedomain.com/file.zip"; 
InputStream is = new BufferedInputStream(url.openStream(), 1024); 

私の懸念は、このアプリは、実際に非常に大きなzipファイルを転送するために使用され、私があれば思っていたということです実際にはBufferedInputStreamがこれを実行する最善の方法か、私はちょうどOutOfMemoryExceptionのいくつかのタイプを投げることに終わるだろうか?

私の質問は、この仕事にはBufferedInputStreamが適しているのでしょうか、まったく違う方法でそれを行うべきでしょうか?

+0

これを処理するには、おそらくライブラリを使用します。ファイルのアップロードは簡単なDOSエントリポイントです。 Apache Commons FileuploadのFileUploadクラスを見てみましょう。 – Perception

+1

@Perception彼はどこにアップロードしていますか?彼はファイルをダウンロードし、解凍します。 – Viruzzo

+0

@Viruzzo - point taken。彼が記述しているプロセスは、ファイルアップロードと非常によく似ていますが、ファイル*転送*は私のコメントではより適切な用語でした。 – Perception

答えて

5

BufferedInputStreamすべてのファイルをメモリにロードせず、サイズが1024バイト= 1kbの場合は内部バッファのみを使用します。それは決してそれより大きくなりません。あなたは一度に多くのストリームを持たない場合、実際に値を増やすことができます。

編集:あなたがおそらく考えているのは、データがメモリに保存されるByteArrayOutputStreamです。公式Java Tutorials - Buffered Streamsから

+0

ありがとうございます、あなたの答えとリンクは本当に役に立ちました。このストリームは一度に実行する唯一のストリームである必要がありますので、サイズを大きくすることを検討します。 –

+0

あなたの編集に関して、私はあなたが正しいと思います - 私は入力ストリームを扱う際にメモリ不足を遭遇しました(それ故私の懸念事項)、私は実際にはByteArrayOutputStreamで作業していたと思います。 –

1

あなたが読んだコンテンツの内容によって異なります。メモリ内のすべてを読むと失敗します。それを別のストリームに書き込むと、うまくいくはずです。 BufferedInputStream

+0

"tempディレクトリに保存する"ので、ディスクに書き込んでいます。 – Viruzzo

+0

優秀、ありがとうございます。 –

1

バッファリングされたJavaプラットフォームの実装I/Oストリーム。バッファ付き入力 ストリームはバッファと呼ばれるメモリ領域からデータを読み取ります。ネイティブの 入力APIは、バッファが空の場合にのみ呼び出されます。同様に、バッファされた 出力ストリームはバッファにデータを書き込み、ネイティブ出力APIはバッファが一杯になったときにだけ呼び出される です。

SUN articleがあります。

したがって、答えは:BufferedInputStreamは、パフォーマンスの面でこの種の仕事に適しています。

はい、メモリ消費量はあまり入力ストリームの種類に依存しません....

+0

+1回答とサポートリンクに感謝します。 –

関連する問題