Javaの ByteBuffer
のサンプルアプリケーションは何ですか?これが使用されるシナリオの例をリストしてください。ありがとうございました!
これ は、その使用法と欠点の適切な説明です。基本的に、高速で低レベルのI/Oを実行する必要がある場合は常に使用します。 TCP/IPプロトコルを実装する場合、またはデータベース(DBMS)を作成する場合、このクラスが役立ちます。
ByteBufferクラスは、Javaでチャネルを使用するための基礎を形成するため重要です。 ByteBufferクラスは、Java 7ドキュメントに記載されているように、バイトバッファーに対する操作の6つのカテゴリ を定義します :
このバッファーから配列に連続したバイトシーケンスを転送する相対 bulk get メソッド。
バイト配列または他のバイトバッファーからこのバッファーに連続したバイトシーケンスを転送する相対 bulk put メソッド。
他のプリミティブ型の値を読み書きする絶対および相対getおよびputメソッド。特定のバイト順でバイトシーケンスとの間で値を変換します。
ビューバッファを作成するためのメソッド。これにより、バイトバッファを他のプリミティブタイプの値を含むバッファとして表示できます。そして
バイトバッファーの compacting 、 duplicateating 、および sliceing のメソッド.
Example code : Putting Bytes into a buffer.
// Create an empty ByteBuffer with a 10 byte capacity
ByteBuffer bbuf = ByteBuffer.allocate(10);
// Get the buffer's capacity
int capacity = bbuf.capacity(); // 10
// Use the absolute put(int, byte).
// This method does not affect the position.
bbuf.put(0, (byte)0xFF); // position=0
// Set the position
bbuf.position(5);
// Use the relative put(byte)
bbuf.put((byte)0xFF);
// Get the new position
int pos = bbuf.position(); // 6
// Get remaining byte count
int rem = bbuf.remaining(); // 4
// Set the limit
bbuf.limit(7); // remaining=1
// This convenience method sets the position to 0
bbuf.rewind(); // remaining=7
ストリーム指向APIを使用するJava IOは、ユーザー空間内のデータの一時ストレージとしてバッファを使用して実行されます。 DMAによってディスクから読み取られたデータは、最初にカーネルスペースのバッファーにコピーされ、次にユーザースペースのバッファーに転送されます。したがって、オーバーヘッドがあります。これを回避すると、パフォーマンスが大幅に向上します。
カーネル空間のバッファーに直接アクセスする方法があれば、ユーザー空間のこの一時バッファーをスキップできます。 Java NIOはそうする方法を提供します。
ByteBuffer
は、Java NIOによって提供されるいくつかのバッファーの1つです。データを読み書きするための単なるコンテナまたはタンクです。上記の動作は、バッファ上のallocateDirect()
APIを使用してダイレクトバッファを割り当てることにより実現されます。
Androidでは、C++とJavaの間に(directAllocメソッドを使用して)共有バッファーを作成し、両側で操作できます。
ここ はByteBufferの利点を説明する素晴らしい記事です。この記事の重要なポイントは次のとおりです。
以下は、直接ByteBuffer/MappedByteBufferに特有の利点です。直接バッファはヒープ外で作成されることに注意してください。
GCサイクルの影響を受けない:直接バッファは、ヒープ外にあるため、ガベージコレクションサイクル中に移動しません。 TerraCotaのBigMemoryキャッシングテクノロジーは、この利点に大きく依存しているようです。ヒープ上にある場合、GCの一時停止時間が遅くなります。
パフォーマンスブースト:ストリームIOでは、読み取り呼び出しはシステムコールを必要とします。これには、ユーザーがカーネルモードとその逆のコンテキスト切り替えが必要で、特にファイルが使用されている場合はコストがかかります常にアクセスします。ただし、メモリマッピングでは、データがメモリ(MappedByteBuffer)で見つかる可能性が高いため、このコンテキストスイッチングは減少します。メモリ内でデータが利用可能な場合、OSを呼び出さずに直接アクセスされます。つまり、コンテキスト切り替えは行われません。
MappedByteBuffersは、ファイルが大きく、ブロックのいくつかのグループがより頻繁にアクセスされる場合は特に便利です。