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

クラスBuffer

java.lang.Object
java.nio.Buffer
直系の既知のサブクラス:
ByteBuffer, CharBuffer, DoubleBuffer, FloatBuffer, IntBuffer, LongBuffer, ShortBuffer

public abstract sealed class Buffer extends Object permits ByteBuffer, CharBuffer, DoubleBuffer, FloatBuffer, IntBuffer, LongBuffer, ShortBuffer
特定のプリミティブ型データのコンテナです。

バッファは、特定のプリミティブ型要素のリニアで有限のシーケンスです。 内容のほかに、容量、リミット、位置という必須プロパティがあります。

容量」は、そのバッファに含まれる要素数によって決定されます。 容量の値は固定で、必ず正の値になります。

リミット」は、読み込みまたは書込みを行ってはならない最初の要素のインデックスです。 容量以下の正の値になります。

位置」は、次に読み込みまたは書込みを行う要素のインデックスです。 リミット以下の正の値になります。

非ブール型のプリミティブ型には、このクラスのサブクラスが1つずつ割り当てられています。

データの転送

このクラスのサブクラスは、それぞれ次の2つのカテゴリに該当する「get」操作および「put」操作を定義します。

相対」操作。現在位置から1個以上の要素の読み込みまたは書込みを行い、転送された要素の数だけ位置を増加します。 要求された転送がリミットを超える場合、相対「get」操作はBufferUnderflowExceptionを、相対「put」操作はBufferOverflowExceptionをスローします。どちらの場合も、データは一切転送されません。

絶対」操作。明示的な要素インデックスを使用するため、位置は変化しません。 インデックス引数がリミットを超える場合、絶対「get」操作および「put」操作はIndexOutOfBoundsExceptionをスローします。

適切なチャネルの入出力操作を行えば、データの転送(バッファとのやりとり)は可能です。この操作は、常に現在位置に対して相対的に行われます。

マークとリセット

バッファの「マーク」は、resetメソッドを呼び出したときに戻る位置を指定するインデックスです。 定義されていない場合もありますが、定義されている場合は必ず位置以下の正の値になります。 位置やリミットの値がマークの値よりも小さい場合、マークは破棄されます。 マークが定義されていない場合、resetメソッドを呼び出すと、InvalidMarkExceptionがスローされます。

Invariants

次のインバリアントは、マーク、位置、リミット、容量の値を表します。

0 <= mark <= position <= limit <= capacity

新しく作成されたバッファの位置は常にゼロ、マークは未定義です。 リミットの初期値はゼロか、バッファの構築方法や種類によってはそれ以外の値になります。 新しく割り当てられたバッファの各要素はゼロに初期化されます。

その他の操作

位置、リミット、容量の値にアクセスするメソッドや、マークやリセットを行うメソッドと同様に、このクラスもバッファに対する次のような操作を定義します。

  • clear()は、新しい一連のチャネル読込み操作または相対「put」操作のためにバッファを準備します。リミットを容量の値に設定し、位置をゼロに設定します。

  • flip()は、新しい一連のチャネル読込み操作または相対「get」操作のためにバッファを準備します。リミットの値を現在位置の値に合わせたあと、位置の値をゼロにします。

  • rewind()は、すでにバッファに格納されているデータを再度読み込めるように、バッファを準備します。リミットの値はそのままで、位置の値をゼロにします。

  • slice()およびslice(index,length)メソッドは、バッファのサブ・シーケンスを作成: 上限および位置は変更されません。

  • duplicate()はバッファの浅いコピーを作成: 限界と位置は変わらない。

読込み専用バッファ

すべてのバッファは読込み可能ですが、書き込みも可能であるとは限りません。 各バッファ・クラスの変異メソッドは「オプションの操作」に指定されており、読取り専用バッファ上で呼び出されるとReadOnlyBufferExceptionをスローします。 読取り専用バッファの内容は変更できません。しかし、マーク、位置、リミットの値は変更可能です。 バッファが読取り専用かどうかは、isReadOnlyメソッドの呼出しによって判断できます。

スレッドの安全性

バッファは、複数の並行スレッドによる使用において安全ではありません。 複数のスレッドで使用する場合は、適切な同期処理によってバッファへのアクセスを制御する必要があります。

呼出しの連鎖

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

    b.flip();
    b.position(23);
    b.limit(42);
これらは、よりコンパクトな形式の一行で置き換えられます。
    b.flip().position(23).limit(42);

シール済クラス階層グラフ:
バッファの密封クラス階層グラフバッファの密封クラス階層グラフ
導入されたバージョン:
1.4