ByteBuffer
Javaでののサンプルアプリケーションは何ですか?これが使用されるシナリオの例をリストしてください。
5 に答える
これは、その使用法と欠点の良い説明です。基本的に、高速の低レベルI/Oを実行する必要がある場合はいつでも使用します。TCP / IPプロトコルを実装する場合、またはデータベース(DBMS)を作成する場合は、このクラスが便利です。
ByteBufferクラスは、Javaでチャネルを使用するための基礎を形成するため重要です。ByteBufferクラスは、Java 7のドキュメントに記載されているように、バイトバッファに対する6つのカテゴリの操作を定義します。
このバッファから配列にバイトの連続シーケンスを転送する相対バルクgetメソッド。
バイト配列または他のバイトバッファからこのバッファにバイトの連続シーケンスを転送する相対バルクプットメソッド。
他のプリミティブ型の値を読み書きし、特定のバイト順序でバイトのシーケンスとの間で変換する絶対および相対のgetおよびputメソッド。
ビューバッファを作成するためのメソッド。これにより、バイトバッファを他のプリミティブ型の値を含むバッファとして表示できます。と
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を使用するJavaIOは、ユーザースペース内のデータの一時ストレージとしてバッファーを使用して実行されます。DMAによってディスクから読み取られたデータは、最初にカーネルスペースのバッファーにコピーされ、次にユーザースペースのバッファーに転送されます。したがって、オーバーヘッドがあります。これを回避すると、パフォーマンスが大幅に向上します。
カーネル空間のバッファに直接アクセスする方法があれば、ユーザー空間のこの一時バッファをスキップできます。JavaNIOはそうする方法を提供します。
ByteBuffer
JavaNIOによって提供されるいくつかのバッファの1つです。データの読み取りまたは書き込みを行うための単なるコンテナまたは保持タンクです。allocateDirect()
上記の動作は、バッファ上のAPIを使用して直接バッファを割り当てることで実現されます。
これは、 ByteBufferの利点を説明するすばらしい記事です。この記事の要点は次のとおりです。
- 直接か間接かに関係なく、ByteBufferの最初の利点は、構造化されたバイナリデータへの効率的なランダムアクセスです(たとえば、回答の1つに記載されている低レベルIO)。Java 1.4より前では、このようなデータを読み取るためにDataInputStreamを使用できましたが、ランダムアクセスはありませんでした。
以下は、特に直接ByteBuffer/MappedByteBufferの利点です。直接バッファはヒープの外部で作成されることに注意してください。
gcサイクルの影響を受けない:直接バッファーはヒープの外にあるため、ガベージコレクションサイクル中に移動されません。TerraCotaのBigMemoryキャッシングテクノロジーは、この利点に大きく依存しているようです。それらがヒープ上にある場合、gcの一時停止時間が遅くなります。
パフォーマンスの向上:ストリームIOでは、読み取り呼び出しにはシステム呼び出しが必要であり、ユーザーからカーネルモードへ、またはその逆のコンテキストスイッチが必要になります。これは、特にファイルに絶えずアクセスしている場合はコストがかかります。ただし、メモリマッピングを使用すると、データがメモリ(MappedByteBuffer)で見つかる可能性が高くなるため、このコンテキストスイッチングは減少します。データがメモリ内で利用可能な場合、OSを呼び出さずに直接アクセスされます。つまり、コンテキスト切り替えは行われません。
MappedByteBuffersは、ファイルが大きく、ブロックの少数のグループがより頻繁にアクセスされる場合に特に便利であることに注意してください。
- ページ共有:メモリマップトファイルは、プロセスの仮想メモリスペースに割り当てられ、プロセス間で共有できるため、プロセス間で共有できます。
Androidでは、C ++とJavaの間で(directAllocメソッドを使用して)共有バッファーを作成し、両側で操作できます。