JavaでのByteBufferの用途は何ですか?[閉まっている]


199

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


1
Apache Hadoopの圧縮(zlibコーデックなど)は、jave.nioのByteBufferを使用します。
nikk

GPUへのデータ送信に適しています。
Pixel

回答:


138

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


3
JavaとCassandra DBを使用して開発された高トラフィックのWebサイトのどこかで役立ちますか?
Aklin、2011年

1
:クイック検索した後、イエスが、カサンドラが使用ByteBufferのないように見えるmail-archive.com/commits@cassandra.apache.org/msg14967.html あなたは生のウェブサイトに疑問を抱いている場合は、あるかもしれませんが、通常はそれだけです間接的にWebサイトで使用されます
-cassandra

1
悪いリンクではありません、ありがとう。-私は有用であることが判明、この1追加したいworldmodscode.wordpress.com/2012/12/14/...
ピーターPerháč

Bad link
i're

96

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

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

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

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

  • 他のプリミティブ型の値を読み書きする絶対および相対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

56
このコメントの大部分は、Java 7のドキュメントからコピーされます。
Janus Troelsen 2013年

6
明らかでない副作用を利用していない限り、絶対配置に間違った方法を使用している可能性があります。Javadocは、絶対配置にはインデックス値が必要であることを示しているようです。
チャックウォルバー、2013年

6
たとえそれがapi docの単なるコピーであったとしても、そのスコアに比べると、何人かの人々はそれを見るのが面倒すぎるようです。
クリス

1
例の1つに誤りがあります。「絶対配置」は、インデックスを表す最初のパラメーター(この場合は0)を欠いています。
bvdb 2015年

21

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

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

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

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


14

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


13

ここに ByteBufferの利点を説明する素晴らしい記事があります。記事の要点は次のとおりです。

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

以下は、直接ByteBuffer / MappedByteBufferに特にメリットがあります。直接バッファはヒープの外で作成されることに注意してください:

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

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

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

  1. ページ共有:メモリマップファイルは、プロセスの仮想メモリ空​​間に割り当てられ、プロセス間で共有できるため、プロセス間で共有できます。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.