web-dev-qa-db-ja.com

JavaでのByteBufferの使用は何ですか?

Javaの ByteBuffer のサンプルアプリケーションは何ですか?これが使用されるシナリオの例をリストしてください。ありがとうございました!

169
Aklin

これ は、その使用法と欠点の適切な説明です。基本的に、高速で低レベルのI/Oを実行する必要がある場合は常に使用します。 TCP/IPプロトコルを実装する場合、またはデータベース(DBMS)を作成する場合、このクラスが役立ちます。

117
kelloti

ByteBufferクラスは、Javaでチャネルを使用するための基礎を形成するため重要です。 ByteBufferクラスは、Java 7ドキュメントに記載されているように、バイトバッファーに対する操作の6つのカテゴリ を定義します

  • 単一バイトを読み書きする絶対および相対 get および put メソッド。

  • このバッファーから配列に連続したバイトシーケンスを転送する相対 bulk get メソッド。

  • バイト配列または他のバイトバッファーからこのバッファーに連続したバイトシーケンスを転送する相対 bulk put メソッド。

  • 他のプリミティブ型の値を読み書きする絶対および相対getおよびputメソッド。特定のバイト順でバイトシーケンスとの間で値を変換します。

  • ビューバッファを作成するためのメソッド。これにより、バイトバッファを他のプリミティブタイプの値を含むバッファとして表示できます。そして

  • バイトバッファーの compactingduplicateating 、および 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
87
ykombinator

ストリーム指向APIを使用するJava IOは、ユーザー空間内のデータの一時ストレージとしてバッファを使用して実行されます。 DMAによってディスクから読み取られたデータは、最初にカーネルスペースのバッファーにコピーされ、次にユーザースペースのバッファーに転送されます。したがって、オーバーヘッドがあります。これを回避すると、パフォーマンスが大幅に向上します。

カーネル空間のバッファーに直接アクセスする方法があれば、ユーザー空間のこの一時バッファーをスキップできます。 Java NIOはそうする方法を提供します。

ByteBufferは、Java NIOによって提供されるいくつかのバッファーの1つです。データを読み書きするための単なるコンテナまたはタンクです。上記の動作は、バッファ上のallocateDirect() APIを使用してダイレクトバッファを割り当てることにより実現されます。

バイトバッファのJavaドキュメントには役立つ情報があります。

19
deepujain

Androidでは、C++とJavaの間に(directAllocメソッドを使用して)共有バッファーを作成し、両側で操作できます。

13
someUser

ここ はByteBufferの利点を説明する素晴らしい記事です。この記事の重要なポイントは次のとおりです。

  • 直接または間接に関係なくByteBufferの最初の利点は、構造化されたバイナリデータの効率的なランダムアクセスです(たとえば、次のいずれかに記載されている低レベルIO回答)。 Java 1.4より前では、このようなデータを読み取るには、DataInputStreamを使用できましたが、ランダムアクセスはできませんでした。

以下は、直接ByteBuffer/MappedByteBufferに特有の利点です。直接バッファはヒープ外で作成されることに注意してください。

  1. GCサイクルの影響を受けない:直接バッファは、ヒープ外にあるため、ガベージコレクションサイクル中に移動しません。 TerraCotaのBigMemoryキャッシングテクノロジーは、この利点に大きく依存しているようです。ヒープ上にある場合、GCの一時停止時間が遅くなります。

  2. パフォーマンスブースト:ストリームIOでは、読み取り呼び出しはシステムコールを必要とします。これには、ユーザーがカーネルモードとその逆のコンテキスト切り替えが必要で、特にファイルが使用されている場合はコストがかかります常にアクセスします。ただし、メモリマッピングでは、データがメモリ(MappedByteBuffer)で見つかる可能性が高いため、このコンテキストスイッチングは減少します。メモリ内でデータが利用可能な場合、OSを呼び出さずに直接アクセスされます。つまり、コンテキスト切り替えは行われません。

MappedByteBuffersは、ファイルが大きく、ブロックのいくつかのグループがより頻繁にアクセスされる場合は特に便利です。

  1. ページ共有:メモリマップファイルは、プロセスの仮想メモリ空​​間に割り当てられ、プロセス間で共有できるため、プロセス間で共有できます。
12
Dheeru Mundluru