サーチ…


前書き

ByteBufferクラスはJava 1.4で導入され、バイナリデータの処理を容易にしました。これはプリミティブ型のデータで使用するのに特に適しています。これは、生成を可能にするだけでなく、より高い抽象化レベルでのbyte[] sの後続の操作も可能にする

構文

  • byte [] arr =新しいバイト[1000];
  • ByteBufferバッファ= ByteBuffer.wrap(arr);
  • ByteBufferバッファ= ByteBuffer.allocate(1024);
  • ByteBufferバッファ= ByteBuffer.allocateDirect(1024);
  • バイトb = buffer.get();
  • バイトb = buffer.get(10);
  • ショートs = buffer.getShort(10);
  • buffer.put((byte)120);
  • buffer.putChar( 'a');

基本的な使い方 - ByteBufferの作成

ByteBufferを作成するには、2つの方法があります.1つは、もう1つは、もう一度細分することができます。

すでに存在するbyte[]がある場合、 ByteBuffer「ラップ」して処理を簡略化できます。

byte[] reqBuffer = new byte[BUFFER_SIZE];
int readBytes = socketInputStream.read(reqBuffer);
final ByteBuffer reqBufferWrapper = ByteBuffer.wrap(reqBuffer);

これは、低レベルのネットワークインタラクションを処理するコードの可能性があります


すでに存在しているbyte[]がない場合は、次のようにバッファに割り当てられた配列にByteBufferを作成することができます:

final ByteBuffer respBuffer = ByteBuffer.allocate(RESPONSE_BUFFER_SIZE);
putResponseData(respBuffer);
socketOutputStream.write(respBuffer.array());

コードパスが非常に重要で、 システムメモリへの直接アクセスが必要場合、 ByteBuffer#allocateDirect()を使用して直接バッファを割り当てることさえできます

基本的な使用法 - バッファにデータを書き込む

ByteBufferインスタンスが与えられると、 相対 的な絶対的な putを使用して、プリミティブ型のデータを書き込むことができます。大きな違いは、 相対メソッドを使用してデータを配置すると、データが挿入されるインデックスが追跡されますが、絶対メソッドでは常にデータをputするインデックスが必要です。

どちらの方法も「連鎖」コールを許可します。十分な大きさのバッファがあれば、それに応じて次のことができる。

buffer.putInt(0xCAFEBABE).putChar('c').putFloat(0.25).putLong(0xDEADBEEFCAFEBABE);

これは以下と同等です:

buffer.putInt(0xCAFEBABE);
buffer.putChar('c');
buffer.putFloat(0.25);
buffer.putLong(0xDEADBEEFCAFEBABE);

byte sで動作するメソッドは特別な名前ではないことに注意してください。さらに、それは両方渡すことも有効だということに注意しByteBufferbyte[]してput 。それ以外のすべてのプリミティブ型は特殊なputメソッドを持っています。

追加の注記:絶対put*を使用するときに指定されるインデックスは、常にbyteカウントされbyte

基本的な使い方 - DirectByteBufferの使用

DirectByteBufferは、 byte[]が存在しないByteBuffer特別な実装です。

このようなByteBufferを呼び出すには、

ByteBuffer directBuffer = ByteBuffer.allocateDirect(16);

この操作では、16バイトのメモリが割り当てられます。ダイレクトバッファの内容は、通常のガベージコレクトされたヒープの外側に存在することがあります。

ByteBufferが直接かどうかは、次の呼び出しによって確認できます。

directBuffer.isDirect(); // true

DirectByteBufferの主な特徴は、追加のバッファリングを行わずにJVMが割り当てられたメモリをネイティブに処理しようとするため、その上に配置された配列を持つByteBufferで実行される操作が速いことです。

リアルタイム通信のように、実行速度に依存するIO操作のDirectByteBufferを使用することをお勧めします。

array()メソッドを使用しようとすると、 UnsupportedOperationExceptionが発生することに注意する必要があります。だから私たちがそれにアクセスしようとする前にByteBufferがバイト配列を持っているかどうかを確認するのは良い習慣です:

 byte[] arrayOfBytes;
 if(buffer.hasArray()) {
     arrayOfBytes = buffer.array();
 }

直接バイトバッファの別の使用法は、JNIを介するinteropです。ダイレクトバイトバッファはbyte[]ではなく実際のメモリブロックを使用するため、ネイティブコードのポインタを介して直接そのメモリにアクセスすることができます。これにより、Javaとネイティブのデータ表現の間でマーシャリングする際のトラブルやオーバーヘッドが軽減されます。

JNIインタフェースは、直接バイトバッファを処理するいくつかの関数を定義しています。NIOサポート



Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow