バイト配列とバイトバッファーの違いは何ですか?
また、どの状況で一方が他方よりも優先されるべきですか?
[私のユースケースは、Javaで開発されているWebアプリケーション用です]。
実際には、バイトを操作する方法がいくつかあります。そして、最高のものを選ぶのは必ずしも簡単ではないことに同意します。
byte[]
Java.nio.ByteBuffer
Java.io.ByteArrayOutputStream
(他のストリームと組み合わせて)Java.util.BitSet
byte[]
は単なるプリミティブ配列であり、生データのみを含んでいます。そのため、コンテンツを構築または操作するための便利な方法がありません。
A ByteBuffer
はビルダーに似ています。byte[]
を作成します。配列とは異なり、より便利なヘルパーメソッドがあります。 (例:append(byte)
メソッド)。 sage に関してはそれほど単純ではありません。 (ほとんどのチュートリアルは複雑すぎるか品質が悪いですが、これは one でどこかに行き着きます。さらに一歩進んでください。それから多くの 落とし穴 を読んでください。 。)
ByteBuffer
はbyte[]
に、StringBuilder
はString
に何をするのかと言いたくなるかもしれません。ただし、ByteBuffer
クラスには特定の違い/欠点があります。配列と同様に、ByteBuffer
のサイズは固定です。したがって、インスタンス化するときは、すでにバッファーのサイズを指定する必要があります。
それが理由の1つです。なぜByteArrayOutputStream
が自動的にサイズ変更されるので、ArrayList
のように (toByteArray()
メソッドがあります)。時々、それをDataOutputStream
でラップするのが実用的です。利点は、いくつかの追加の便利な呼び出しがあることです(たとえば、必要な場合はwriteShort(int)
2バイトを書き込みます。)
BitSet
は、ビットレベルの演算を実行するときに便利です。個々のビットを取得/設定でき、xor()
のような論理演算子メソッドがあります。 。 (toByteArray()
メソッドはJava 7.でのみ導入されました。)
もちろん、必要に応じて、それらすべてを組み合わせてbyte[]
を構築できます。
ByteBufferは、ファイルベースのデータの高速スループットのために開発された新しいIOパッケージ(nio)の一部です。具体的には、Apacheはバイトを読み取るため、非常に高速なWebサーバー(Cで記述)さまざまなバッファを介してそれらをシャッフルすることなく、ディスクから直接ネットワークに配置します。これは、メモリマップファイルを介して行われます。これは、初期バージョンのJavaにはありませんでした。 JavaこれはApacheと同程度の高速です。ファイルからネットワークへのスループットを非常に高速にしたい場合は、メモリマップファイルとByteBufferを使用します。
通常、データベースはメモリマップファイルを使用しますが、このタイプの使用法はJavaではあまり効率的ではありません。 C/C++では、大量のメモリをロードし、必要な型付きデータにキャストできます。 Javaのセキュリティモデルのため、特定のネイティブタイプにしか変換できず、これらの変換はあまり効率的ではないため、これは一般に実行できません。 ByteBufferは、バイトをプレーンバイトデータとして処理している場合に最適に機能します。バイトをオブジェクトに変換する必要があると、他のJava ioクラスは通常、パフォーマンスが向上し、使いやすくなります。
メモリマップファイルを処理していない場合は、ByteBufferを気にする必要はありません。通常、バイトの配列を使用します。ファイルベースの生バイトデータの可能な限り高速なスループットでWebサーバーを構築しようとしている場合、ByteBuffer(特にMappedByteBuffer)はあなたの親友です。