web-dev-qa-db-ja.com

バイト配列を使用する場合とバイトバッファを使用する場合

バイト配列とバイトバッファーの違いは何ですか?
また、どの状況で一方が他方よりも優先されるべきですか?

[私のユースケースは、Javaで開発されているWebアプリケーション用です]。

59
Rajat Gupta

実際には、バイトを操作する方法がいくつかあります。そして、最高のものを選ぶのは必ずしも簡単ではないことに同意します。

  • byte[]
  • Java.nio.ByteBuffer
  • Java.io.ByteArrayOutputStream(他のストリームと組み合わせて)
  • Java.util.BitSet

byte[]は単なるプリミティブ配列であり、生データのみを含んでいます。そのため、コンテンツを構築または操作するための便利な方法がありません。

A ByteBufferはビルダーに似ています。byte[]を作成します。配列とは異なり、より便利なヘルパーメソッドがあります。 (例:append(byte)メソッド)。 sage に関してはそれほど単純ではありません。 (ほとんどのチュートリアルは複雑すぎるか品質が悪いですが、これは one でどこかに行き着きます。さらに一歩進んでください。それから多くの 落とし穴 を読んでください。 。)

ByteBufferbyte[]に、StringBuilderStringに何をするのかと言いたくなるかもしれません。ただし、ByteBufferクラスには特定の違い/欠点があります。配列と同様に、ByteBufferのサイズは固定です。したがって、インスタンス化するときは、すでにバッファーのサイズを指定する必要があります。

それが理由の1つです。なぜByteArrayOutputStreamが自動的にサイズ変更されるので、ArrayListのようにtoByteArray()メソッドがあります)。時々、それをDataOutputStreamでラップするのが実用的です。利点は、いくつかの追加の便利な呼び出しがあることです(たとえば、必要な場合はwriteShort(int) 2バイトを書き込みます。)

BitSetは、ビットレベルの演算を実行するときに便利です。個々のビットを取得/設定でき、xor()のような論理演算子メソッドがあります。 。 (toByteArray()メソッドはJava 7.でのみ導入されました。)

もちろん、必要に応じて、それらすべてを組み合わせてbyte[]を構築できます。

43
bvdb

ByteBufferは、ファイルベースのデータの高速スループットのために開発された新しいIOパッケージ(nio)の一部です。具体的には、Apacheはバイトを読み取るため、非常に高速なWebサーバー(Cで記述)さまざまなバッファを介してそれらをシャッフルすることなく、ディスクから直接ネットワークに配置します。これは、メモリマップファイルを介して行われます。これは、初期バージョンのJavaにはありませんでした。 JavaこれはApacheと同程度の高速です。ファイルからネットワークへのスループットを非常に高速にしたい場合は、メモリマップファイルとByteBufferを使用します。

通常、データベースはメモリマップファイルを使用しますが、このタイプの使用法はJavaではあまり効率的ではありません。 C/C++では、大量のメモリをロードし、必要な型付きデータにキャストできます。 Javaのセキュリティモデルのため、特定のネイティブタイプにしか変換できず、これらの変換はあまり効率的ではないため、これは一般に実行できません。 ByteBufferは、バイトをプレーンバイトデータとして処理している場合に最適に機能します。バイトをオブジェクトに変換する必要があると、他のJava ioクラスは通常、パフォーマンスが向上し、使いやすくなります。

メモリマップファイルを処理していない場合は、ByteBufferを気にする必要はありません。通常、バイトの配列を使用します。ファイルベースの生バイトデータの可能な限り高速なスループットでWebサーバーを構築しようとしている場合、ByteBuffer(特にMappedByteBuffer)はあなたの親友です。

23
JRalph
3
bluefoot