- すべての実装されたインタフェース:
Comparable<ByteBuffer>
public abstract class MappedByteBuffer extends ByteBuffer
マップされたbyteバッファは、FileChannel.map
メソッドで作成されます。 このクラスは、メモリー・マップされたファイル領域に特有の操作を使用してByteBuffer
クラスを拡張します。
マップされたbyteバッファと、これによって表されるファイル・マッピングは、バッファ自体がガベージ・コレクトされるまで有効です。
たとえば、何らかのプログラムによって、マップされたファイルの対応する領域の内容が変更されれば、マップされたbyteバッファの内容も変更されます。 こうした変更が発生するかどうか、またどのタイミングで発生するかは、オペレーティング・システムによって異なるため、未指定です。
マップされたbyteバッファ全体またはその一部にアクセスできなくなることがあります。たとえば、マップされたファイルの切詰めが行われると、このような事態が発生します。 マップされたbyteバッファのアクセス不可な領域にアクセスしようとしても、バッファの内容は変更されませんが、アクセスしたときまたはそのあとで未指定の例外がスローされます。 事前に適切な予防措置をとり、このプログラムや並行して実行されているプログラムから、マップされたファイルに対して読み込みと書込み以外の操作を実行できないようにすることを強くお薦めします。
それ以外の点では、マップされたbyteバッファは通常のダイレクトbyteバッファと同じように動作します。
- 導入されたバージョン:
- 1.4
-
メソッドのサマリー
修飾子と型 メソッド 説明 MappedByteBuffer
clear()
このバッファをクリアします。MappedByteBuffer
flip()
このバッファをフリップ(反転)します。MappedByteBuffer
force()
このバッファの内容への変更を、マップされたファイルが格納されている記憶装置へ強制的に書き込みます。MappedByteBuffer
force(int index, int length)
このバッファ・コンテンツのリージョンに対して行われたすべての変更を、マップされたファイルを含むストレージ・デバイスに強制的に書き込みます。boolean
isLoaded()
このバッファの内容が物理メモリー内にあるかどうかを判断します。MappedByteBuffer
limit(int newLimit)
このバッファのリミットを設定します。MappedByteBuffer
load()
このバッファの内容を物理メモリーにロードします。MappedByteBuffer
mark()
このバッファの現在位置にマークを設定します。MappedByteBuffer
position(int newPosition)
このバッファの位置を設定します。MappedByteBuffer
reset()
バッファの位置を以前にマークした位置に戻します。MappedByteBuffer
rewind()
このバッファをリワインド(巻き戻し)します。クラス java.nio.ByteBufferで宣言されたメソッド
alignedSlice, alignmentOffset, allocate, allocateDirect, array, arrayOffset, asCharBuffer, asDoubleBuffer, asFloatBuffer, asIntBuffer, asLongBuffer, asReadOnlyBuffer, asShortBuffer, compact, compareTo, duplicate, equals, get, get, get, get, get, get, getChar, getChar, getDouble, getDouble, getFloat, getFloat, getInt, getInt, getLong, getLong, getShort, getShort, hasArray, hashCode, isDirect, mismatch, order, order, put, put, put, put, put, put, put, putChar, putChar, putDouble, putDouble, putFloat, putFloat, putInt, putInt, putLong, putLong, putShort, putShort, slice, slice, toString, wrap, wrap
-
メソッドの詳細
-
isLoaded
public final boolean isLoaded()このバッファの内容が物理メモリー内にあるかどうかを判断します。戻り値が
true
の場合は、このバッファ内のすべてのデータが物理メモリーに格納されている可能性が高くなります。この場合、データにアクセスしたときに、仮想メモリーのページ違反や入出力操作は発生しません。 ただし、戻り値がfalse
の場合でも、バッファの内容が物理メモリーに格納されていることがあります。戻り値は絶対的なものではなく、単なる手がかりです。なぜなら、このメソッド呼出しが値を返すまでの間に、基礎にあるオペレーティング・システムによってバッファのデータの一部がページ・アウトされている可能性があるからです。
- 戻り値:
- 現在のバッファの内容が物理メモリーに格納されている可能性がある場合
true
-
load
public final MappedByteBuffer load()このバッファの内容を物理メモリーにロードします。このメソッドは、値を返すときに、現在のバッファの内容を物理メモリー内にできるだけ格納しようとします。 このメソッドを呼び出すと、ページ違反や入出力操作が発生する可能性があります。
- 戻り値:
- このバッファ
-
force
public final MappedByteBuffer force()このバッファの内容への変更を、マップされたファイルが格納されている記憶装置へ強制的に書き込みます。このバッファにマップされるファイルがローカルの記憶装置に格納されている場合は、ファイルを作成してからまたはこのメソッドを最後に呼び出してから行ったすべての変更が、値を返すときにこの記憶装置に強制的に書き込まれます。
一方、ファイルがローカルの記憶装置上にない場合、書込みは行われません。
このバッファが読取り/書込みモード(
FileChannel.MapMode.READ_WRITE
)にマップされていない場合は、このメソッドを呼び出しても効果がない可能性があります。 特に、このメソッドは、読取り専用またはプライベート・マッピング・モードでマップされたバッファには影響しません。 このメソッドは、実装固有のマッピング・モードに有効である場合も、そうでない場合もあります。- 戻り値:
- このバッファ
-
force
public final MappedByteBuffer force(int index, int length)このバッファ・コンテンツのリージョンに対して行われたすべての変更を、マップされたファイルを含むストレージ・デバイスに強制的に書き込みます。 リージョンは、このバッファ内の指定されたindex
から開始され、length
バイトです。このバッファにマップされたファイルがローカル・ストレージ・デバイスに存在する場合、このメソッドが戻ると、リージョン・バッファが作成された後、またはこのメソッドが最後に起動された後に、選択されたリージョン・バッファに対して行われたすべての変更が、そのデバイスに書き込まれていることが保証されます。 強制操作では、指定したリージョンの外にあるバイトを書き込み、たとえば、一部のデバイス固有の粒度のデータ・ブロックが全体に転送されるようにします。
一方、ファイルがローカルの記憶装置上にない場合、書込みは行われません。
このバッファが読取り/書込みモード(
FileChannel.MapMode.READ_WRITE
)にマップされていない場合は、このメソッドを呼び出しても効果がない可能性があります。 特に、このメソッドは、読取り専用またはプライベート・マッピング・モードでマップされたバッファには影響しません。 このメソッドは、実装固有のマッピング・モードに有効である場合も、そうでない場合もあります。- パラメータ:
index
- 記憶域にライトバックされるバッファ・リージョンの最初のバイトの索引。limit()以上である必要があります。length
- リージョンの長さ(バイト数)です。負数でないか、limit() - indexより大きい値である必要があります- 戻り値:
- このバッファ
- 例外:
IndexOutOfBoundsException
- 索引および長さに対する事前条件が保持されていない場合。- 導入されたバージョン:
- 13
-
position
public final MappedByteBuffer position(int newPosition)このバッファの位置を設定します。 新しい位置の値よりもマークの値のほうが大きい場合、マークの定義は破棄されます。 -
limit
public final MappedByteBuffer limit(int newLimit)このバッファのリミットを設定します。 位置の値が新しいリミットより大きい場合、リミットと同じ値に変更されます。 マークの値が新しいリミットより大きい場合、マークの定義は破棄されます。 -
mark
public final MappedByteBuffer mark()このバッファの現在位置にマークを設定します。 -
reset
public final MappedByteBuffer reset()バッファの位置を以前にマークした位置に戻します。このメソッドを呼び出しても、マークの値は変更されません。マークが破棄されることもありません。
-
clear
public final MappedByteBuffer clear()このバッファをクリアします。 バッファの位置はゼロ、リミットは容量の値に設定されます。マークは破棄されます。一連のチャネル読込み操作または「put」操作を使用してこのバッファにデータを格納する前に、このメソッドを呼び出します。 次に例を示します。
buf.clear(); // Prepare buffer for reading in.read(buf); // Read data
このメソッドはバッファ内のデータを実際に消去するわけではありません。しかし、そうした状況で使用されるため、クリアと命名されています。
-
flip
public final MappedByteBuffer flip()このバッファをフリップ(反転)します。 リミットは現在位置の値に設定され、現在位置を表す値はゼロに設定されます。 マークが定義されている場合、そのマークは破棄されます。一連のチャネル読込み操作(put)のあと、このメソッドを呼び出してチャネル書込み操作(相対「get」)の準備を行います。 次に例を示します。
buf.put(magic); // Prepend header in.read(buf); // Read data into rest of buffer buf.flip(); // Flip buffer out.write(buf); // Write header + data to channel
ある場所から別の場所にデータを転送する際、このメソッドを
compact
メソッドと組み合わせて使用することがあります。 -
rewind
public final MappedByteBuffer rewind()このバッファをリワインド(巻き戻し)します。 位置はゼロに設定され、マークは破棄されます。このメソッドは、リミットを正しく設定したあと、一連のチャネル書込み操作(get)の前に呼び出します。 次に例を示します。
out.write(buf); // Write remaining data buf.rewind(); // Rewind buffer buf.get(array); // Copy data into array
-