モジュール java.base
パッケージ java.nio

クラスByteBuffer

java.lang.Object
java.nio.Buffer
java.nio.ByteBuffer
すべての実装されたインタフェース:
Comparable<ByteBuffer>
直系の既知のサブクラス:
MappedByteBuffer

public abstract sealed class ByteBuffer extends Buffer implements Comparable<ByteBuffer> permits MappedByteBuffer (not exhaustive)
byteバッファです。

このクラスは、byteバッファに対する操作を次の6つのカテゴリに分類します。

  • 単一byte値の読み込みと書込みを行う絶対および相対get/putメソッド。

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

  • バイト配列またはほかのバイト・バッファ内の連続バイト・シーケンスを、このバッファに転送する絶対および相対bulk putメソッド。

  • その他のプリミティブ型の値の読み込みと書込みを行い、これらの値とbyteシーケンスを特定のbyte順序で相互変換する、絶対および相対get/putメソッド。

  • その他のプリミティブ型の値を格納するバッファとしてbyteバッファを表示できる、「ビュー・バッファ」の作成メソッド

  • バイト・バッファをcompactingするためのメソッド。

byteバッファを作成するには、バッファの内容に容量を割り当てる割り当て,を実行するか、既存のbyte配列をバッファ内にラップします。

ダイレクト・バッファ非ダイレクト・バッファ

byteバッファには、「ダイレクト」バッファと「非ダイレクト」バッファがあります。 ダイレクトbyteバッファの場合、Java仮想マシンは、ネイティブの入出力操作を直接実行しようとします。 これは、基本となるオペレーティング・システム固有の入出力操作を呼び出す際、中間バッファを介さないということです。

ダイレクトbyteバッファは、このクラスのファクトリ・メソッドallocateDirectを呼び出すと作成されます。 通常は、こちらのバッファのほうが、非ダイレクト・バッファよりも割当ておよび解放コストがやや高くなります。 ダイレクト・バッファの内容が標準のガベージ・コレクトされたヒープの外部にあるなら、アプリケーションのメモリー・フットプリントに対する影響はわずかです。 このことから、ダイレクト・バッファには、基本となるシステム固有の入出力操作に従属する、寿命が長く容量の大きいバッファを指定することをお薦めします。 一般に、直接バッファは、プログラムのパフォーマンスが大幅に向上した場合にのみ割り当てることをお薦めします。

ダイレクトbyteバッファは、ファイルの特定の領域をメモリーに直接マッピングする方法でも作成できます。 Javaプラットフォームの実装によっては、JNIを介してネイティブ・コードからダイレクトbyteバッファを生成する機能がオプションでサポートされている可能性があります。 こうした種類のバッファのインスタンスが、メモリー内のアクセスできない領域を参照した場合、その領域にアクセスしようとしてもバッファの内容は変更されず、アクセス時またはアクセス後に何らかの例外がスローされます。

特定のbyteバッファがダイレクト・バッファ、非ダイレクト・バッファのどちらであるかを判断するには、isDirectメソッドを呼び出します。 このメソッドを使用すると、性能が重視されるコード内で明示的にバッファ管理を行えます。

バイナリ・データへのアクセス

このクラスは、booleanを除く他のすべてのプリミティブ型の値の読取りおよび書込みを行うメソッドを定義します。 プリミティブ値とbyteシーケンスとの相互変換は、バッファの現在のbyte順序に従って行われます。byte順序を取得および変更するには、orderメソッドを使用します。 特定のbyte順序は、ByteOrderクラスのインスタンスで表されます。 byteバッファの初期順序は、常にBIG_ENDIANです。

異種バイナリ・データ、すなわち型の異なる値のシーケンスにアクセスできるようにするため、このクラスは、型ごとに一連の絶対および相対get/putメソッドのファミリを定義します。 たとえば、32ビットの浮動小数点数(float値)の場合、次のメソッドが定義されます。

対応するメソッドは、char, short, int, longおよびdouble型に対して定義されます。 絶対get/putメソッドのインデックス・パラメータの単位は、読み込みまたは書込みの対象となる型ではなく、byteです。

同種のバイナリ・データ、すなわち同じ型の値のシーケンスにアクセスできるようにするため、このクラスには、指定されたbyteバッファの「ビュー」を作成できるメソッドが定義されています。 ビュー・バッファ」とは、byteバッファに連動した内容を持つ、別のバッファのことです。 byteバッファの内容に変更を加えると、ビュー・バッファにもその内容が反映されます。反対に、ビュー・バッファの内容に変更を加えると、byteバッファにもその内容が反映されます。この2つのバッファの位置、リミット、マークの値は、それぞれ独立しています。 たとえば、asFloatBufferメソッドは、このメソッドの呼出し元のbyteバッファに連動したFloatBufferクラスのインスタンスを作成します。 対応するビュー作成メソッドは、char, short, int, longおよびdouble型に対して定義されます。

ビュー・バッファには、前述した一連の型固有のget/putメソッドに勝る重要な利点が3つあります。

  • ビュー・バッファには、byteではなく、その値の型固有のサイズによってインデックスが付けられる

  • ビュー・バッファは、バッファと配列または同じ型のその他のバッファ間で連続した値のシーケンスをやりとりできる、相対一括get/putメソッドを提供する

  • ビュー・バッファは、補助byteバッファがダイレクト・バッファである場合にかぎりダイレクト・バッファになるという点で、潜在的に効率がよい

ビュー・バッファのbyte順序は、ビューの生成時にbyteバッファと同じものに固定されます。

呼出しの連鎖

このクラスのメソッドのうち戻り値を返さないものは、自身を呼び出したバッファの情報を返します。 これを応用して、メソッド呼出しを連鎖させることができます。 たとえば、次のような連続した文があるとしましょう。

    bb.putInt(0xCAFEBABE);
    bb.putShort(3);
    bb.putShort(45);
これらは、次の一文で置き換えられます。
    bb.putInt(0xCAFEBABE).putShort(3).putShort(45);

オプションの操作

オプションの操作として指定されたメソッドは、read-only ByteBufferで呼び出されるとReadOnlyBufferExceptionをスローします。 ByteBufferが「アクセス可能なバイト配列」 (ByteBufferが読取り専用かどうかに関係なく、)に支えられていない場合、メソッド「配列」およびarrayOffsetUnsupportedOperationExceptionをスローします。
シール済クラス階層グラフ:
ByteBufferのシール済クラス階層グラフByteBufferのシール済クラス階層グラフ
導入されたバージョン:
1.4