Java Language
ByteBuffer
サーチ…
前書き
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で動作するメソッドは特別な名前ではないことに注意してください。さらに、それは両方渡すことも有効だということに注意しByteBuffer
とbyte[]
して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サポート 。