2012-03-05 3 views
5

私は現在、バッファされたストリームを使用していくつかのファイルを読み書きしています。その間に、記号が1バイトの数学的処理をします。DataInputStream DataOutputStreamのパフォーマンス

InputStream input = new FileInputStream(outputname) 
input.read(byte[] b,int off,int len) 

を書き込むには:読むに

OutputStream output = new BufferedOutputStream(
          new FileOutputStream(outputname), 
          OUTPUTBUFFERSIZE 
         ) 
output.write((byte)byteinsideaint); 

今、私はいくつかのヘッダデータを追加するために、そして短すぎるシンボルをサポートする必要があります。私はDataInputStreamDataOutputStreamを使用して、他のタイプをバイトに変換しないようにしたいと思います。

は、私は、データのバッファリングの利点を維持するために

OutputStream output = new DataOutputStream(
          new BufferedOutputStream(
            new FileOutputStream(outputname), 
            OUTPUTBUFFERSIZE 
          ) 
         ); 

を使用する必要がありますか、あなたが間にBufferedOutputStreamを追加する必要があります

OutputStream output = new DataOutputStream(
          new FileOutputStream(outputname) 
         ) 

答えて

7

を使用するには十分です。 DataOutputStreamはキャッシュを実装していません(これは良い点です:懸念の分離)、そのパフォーマンスは、下にあるOutputStreamをキャッシュすることなく非常に悪くなります。 writeInt()のような最も簡単な方法でさえ、4つの別々のディスク書き込みが行われる可能性があります。

write(byte[], int, int)writeUTF(String)は1つのbyte[]チャンクにデータを書き込んでいます。他のものは、バイト単位でプリミティブ値(intまたはdoubleなど)を書き込みます。

+0

これは私の一日を完全に助けました。ありがとう^^ – Lake

1

真ん中にBufferedOutputStreamが必要です。

私はパフォーマンスについてのあなたの懸念を感謝し、私は2件の提案があります:

  1. は、Javaの圧縮を使用してストリームを縮小します。役に立つ記事はhereです。
  2. 継承の代わりにコンポジションを使用します(とにかく推奨される方法です)。 getInputStream()およびgetOutputStream()メソッドを使用して、PipedInputStreamとPipedOutputStreamが互いに接続されたパイプを作成します。ストリームを必要とするものにPipeオブジェクトを直接渡すことはできませんが、getの戻り値を渡すことができますそれを行う方法。
+0

ありがとうございました。私の仕事の要件では、難しいものを圧縮してはいけません。 – UmNyobe

+0

GZip *ストリームは、Javaで大きな問題を抱えていますが、これはネイティブコールで多くのメモリを使用しているためです。おそらくLZ-4が良いでしょう。 – claj

関連する問題