2011-01-03 8 views
8

他の人のコードを読んでいます。ここにそれの要点があります。FileOutputStreamとByteArrayOutputStream

クラスは、GZIPInputStreamおよびGZIPOutputStreamを使用してファイルを圧縮および解凍します。

ここでは、圧縮中に起こることのスニペットを示します。 inputFileおよびoutputFileは、クラスFileのインスタンスです。

FileInputStream fis = new FileInputStream(inputFile); 
GZIPOutputStream gzos = new GZIPOutputStream(new FileOutputStream(outputFile)); 

//the following function copies an input stream to an output stream 
IOUtils.copy(fis,gzos); 

//outputFile is the compressed file 
... 

次に、解凍​​中の処理について説明します。

GZIPInputStream gzis = new GZIPInputStream(new FileInputStream(inputFile)); 
ByteArrayOutputStream baos = new ByteArrayOutputStream(); 

//copies input stream to output stream 
IOUtils.copy(gzis,baos); 

//this method does as its name suggests 
FileUtils.writeByteArrayToFile(outputFile, baos.toByteArray()); 

//outputFile is the decompressed file 
... 

元プログラマは解凍時の圧縮時FileOutputStreamByteArrayOutputStreamを選んだ可能性のある理由は何ですか?それは私を混乱させます。

正当な理由がない限り、将来の混乱を避けるために一貫性があるように変更していると思います。これは良いアイデアですか?

+0

IOUtilsとFileUtilsはプロプライエタリであるか、commons-ioのようなlibからですか? – sblundy

+0

@sblundy、それらはcommons-ioのようなライブラリからのものです。 – Russell

答えて

11

Hehは、さまざまなソースからコードをコピーして貼り付けたようですね。 :-Pいいえ、真剣に言えば、圧縮解除されたデータを調べる必要がない場合は、圧縮と圧縮解除の両方にBufferedOutputStreamを使用できます。

+0

そうだね – sblundy

+1

その場合は、 'new FileOutputStream(outputFile)'の代わりに 'new BufferedOutputStream(new FileOutputStream(outputFile)'を使用することをお勧めしますか?パフォーマンスの向上はありますか? – Russell

+1

実際のソリューションがBufferedInputStreamとBufferedOutputStreamを使用するときのパフォーマンスを向上させることができます。 –

0

ByteArrayOutputStreamは、彼/彼女に素晴らしいを渡しますか?

真剣に言えば、おそらく異なる時期に行われたと思われます。可能であれば、私はVCSログを調べるでしょう。

+0

良いアイデア。私はログを確認する必要があります。 – Russell

4

ByteArrayOutputStreamは、コンテンツ全体がJavaのメモリ(フレーバがbyte[])に格納されているため、より多くのメモリを消費します。 FileOutputStreamはディスクに直接書き込むため、メモリの消費量が少なくなります。この特定のケースではByteArrayOutputStreamを使用する賢明な理由はありません。その後、個々のバイトは変更されません。後でファイルにそのまま書き込まれます。したがって、不要な中間ステップです。

2

プログラマーは、圧縮時にFileInputStreamを使用し、解凍時にはバッファーを使用しました。その理由は、あなたがファイルを読んでいないと悪いことは起こらないということでした。あなたはただ失敗し、例外がスローされます。

解凍中にエラーが発生し、すでにファイルへの書き込みを開始している場合は、ファイルが破損しています。だから彼はまずバッファを書いてから、ディスクにバッファを書き込むために圧縮解除が完了すると決めました。比較的小さなファイルを扱っている場合、この解決策は問題ありません。さもなければ、これは多くのメモリを必要とし、OutOfMemeoryErrorを生成する可能性があります。

私は直接ファイルをに引き出し、一時ファイルの名前を恒久的な名前に変更します。最後に、ブロックは、一時ファイルを削除するように注意する必要があります。

+0

良い考え。失敗した書き込みを処理するコードはどこにもないように見えました。この特定のケースでは、コピー貼りか、別の時に書かれたものです。 – Russell

関連する問題