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

クラスMappedByteBuffer

すべての実装されたインタフェース:
Comparable<ByteBuffer>

public abstract class MappedByteBuffer extends ByteBuffer
ファイルのメモリー・マップ領域を内容とするダイレクトbyteバッファです。

マップされたbyteバッファは、FileChannel.mapメソッドで作成されます。 このクラスは、メモリー・マップされたファイル領域に特有の操作を使用してByteBufferクラスを拡張します。

マップされたbyteバッファと、これによって表されるファイル・マッピングは、バッファ自体がガベージ・コレクトされるまで有効です。

たとえば、何らかのプログラムによって、マップされたファイルの対応する領域の内容が変更されれば、マップされたbyteバッファの内容も変更されます。 こうした変更が発生するかどうか、またどのタイミングで発生するかは、オペレーティング・システムによって異なるため、未指定です。

マップされたbyteバッファ全体またはその一部にアクセスできなくなることがあります。たとえば、マップされたファイルの切詰めが行われると、このような事態が発生します。 マップされたbyteバッファのアクセス不可な領域にアクセスしようとしても、バッファの内容は変更されませんが、アクセスしたときまたはそのあとで未指定の例外がスローされます。 事前に適切な予防措置をとり、このプログラムや並行して実行されているプログラムから、マップされたファイルに対して読み込みと書込み以外の操作を実行できないようにすることを強くお薦めします。

それ以外の点では、マップされたbyteバッファは通常のダイレクトbyteバッファと同じように動作します。

導入されたバージョン:
1.4
  • メソッドの詳細

    • isLoaded

      public final boolean isLoaded()
      このバッファの内容が物理メモリー内にあるかどうかを判断します。

      戻り値がtrueの場合は、このバッファ内のすべてのデータが物理メモリーに格納されている可能性が高くなります。この場合、データにアクセスしたときに、仮想メモリーのページ違反や入出力操作は発生しません。 ただし、戻り値がfalseの場合でも、バッファの内容が物理メモリーに格納されていることがあります。

      戻り値は絶対的なものではなく、単なる手がかりです。なぜなら、このメソッド呼出しが値を返すまでの間に、基礎にあるオペレーティング・システムによってバッファのデータの一部がページ・アウトされている可能性があるからです。

      戻り値:
      現在のバッファの内容が物理メモリーに格納されている可能性がある場合true
    • load

      public final MappedByteBuffer load()
      このバッファの内容を物理メモリーにロードします。

      このメソッドは、値を返すときに、現在のバッファの内容を物理メモリー内にできるだけ格納しようとします。 このメソッドを呼び出すと、ページ違反や入出力操作が発生する可能性があります。

      戻り値:
      このバッファ
    • force

      public final MappedByteBuffer force()
      このバッファの内容への変更を、マップされたファイルが格納されている記憶装置へ強制的に書き込みます。 リージョンは、このバッファのインデックス0で始まり、capacity()バイトです。 このメソッドの起動は、呼出しforce(0,capacity())とまったく同じように動作します。

      このバッファにマップされるファイルがローカルの記憶装置に格納されている場合は、ファイルを作成してからまたはこのメソッドを最後に呼び出してから行ったすべての変更が、値を返すときにこの記憶装置に強制的に書き込まれます。

      一方、ファイルがローカルの記憶装置上にない場合、書込みは行われません。

      このバッファが読取り/書込みモード(FileChannel.MapMode.READ_WRITE)にマップされていない場合は、このメソッドを呼び出しても効果がない可能性があります。 特に、このメソッドは、読取り専用またはプライベート・マッピング・モードでマップされたバッファには影響しません。 このメソッドは、実装固有のマッピング・モードに有効である場合も、そうでない場合もあります。

      戻り値:
      このバッファ
      例外:
      UncheckedIOException - マップされたファイルを含むストレージ・デバイスにバッファ・コンテンツを書き込むI/Oエラーが発生した場合
    • force

      public final MappedByteBuffer force(int index, int length)
      このバッファ・コンテンツのリージョンに対して行われたすべての変更を、マップされたファイルを含むストレージ・デバイスに強制的に書き込みます。 リージョンは、このバッファ内の指定されたindexから開始され、lengthバイトです。

      このバッファにマップされたファイルがローカル・ストレージ・デバイスに存在する場合、このメソッドが戻ると、リージョン・バッファが作成された後、またはこのメソッドが最後に起動された後に、選択されたリージョン・バッファに対して行われたすべての変更が、そのデバイスに書き込まれていることが保証されます。 強制操作では、指定したリージョンの外にあるバイトを書き込み、たとえば、一部のデバイス固有の粒度のデータ・ブロックが全体に転送されるようにします。

      一方、ファイルがローカルの記憶装置上にない場合、書込みは行われません。

      このバッファが読取り/書込みモード(FileChannel.MapMode.READ_WRITE)にマップされていない場合は、このメソッドを呼び出しても効果がない可能性があります。 特に、このメソッドは、読取り専用またはプライベート・マッピング・モードでマップされたバッファには影響しません。 このメソッドは、実装固有のマッピング・モードに有効である場合も、そうでない場合もあります。

      パラメータ:
      index - バッファ・リージョンの最初のバイトの索引で、記憶域に書き戻す必要があります。負以外でcapacity()未満である必要があります
      length - リージョンの長さ(バイト単位)。負以外で、capacity() - index以下にする必要があります
      戻り値:
      このバッファ
      例外:
      IndexOutOfBoundsException - 索引および長さに対する事前条件が保持されていない場合。
      UncheckedIOException - マップされたファイルを含むストレージ・デバイスにバッファ・コンテンツを書き込むI/Oエラーが発生した場合
      導入されたバージョン:
      13
    • position

      public final MappedByteBuffer position(int newPosition)
      このバッファの位置を設定します。 新しい位置の値よりもマークの値のほうが大きい場合、マークの定義は破棄されます。
      オーバーライド:
      クラスBufferposition
      パラメータ:
      newPosition - 新しい位置の値は、現在のリミット以下の負でない値でなければならない
      戻り値:
      このバッファ
    • limit

      public final MappedByteBuffer limit(int newLimit)
      このバッファのリミットを設定します。 位置の値が新しいリミットより大きい場合、リミットと同じ値に変更されます。 マークの値が新しいリミットより大きい場合、マークの定義は破棄されます。
      オーバーライド:
      クラスBufferlimit
      パラメータ:
      newLimit - 新しいリミット値は、このバッファの容量以下の負でない値でなければならない
      戻り値:
      このバッファ
    • mark

      public final MappedByteBuffer mark()
      このバッファの現在位置にマークを設定します。
      オーバーライド:
      クラスBuffermark
      戻り値:
      このバッファ
    • reset

      public final MappedByteBuffer reset()
      バッファの位置を以前にマークした位置に戻します。

      このメソッドを呼び出しても、マークの値は変更されません。マークが破棄されることもありません。

      オーバーライド:
      クラスBufferreset
      戻り値:
      このバッファ
    • clear

      public final MappedByteBuffer clear()
      このバッファをクリアします。 バッファの位置はゼロ、リミットは容量の値に設定されます。マークは破棄されます。

      一連のチャネル読込み操作または「put」操作を使用してこのバッファにデータを格納する前に、このメソッドを呼び出します。 次に例を示します。

       buf.clear();     // Prepare buffer for reading
       in.read(buf);    // Read data

      このメソッドはバッファ内のデータを実際に消去するわけではありません。しかし、そうした状況で使用されるため、クリアと命名されています。

      オーバーライド:
      クラスBufferclear
      戻り値:
      このバッファ
    • 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メソッドと組み合わせて使用することがあります。

      オーバーライド:
      クラスBufferflip
      戻り値:
      このバッファ
    • rewind

      public final MappedByteBuffer rewind()
      このバッファをリワインド(巻き戻し)します。 位置はゼロに設定され、マークは破棄されます。

      このメソッドは、リミットを正しく設定したあと、一連のチャネル書込み操作(get)の前に呼び出します。 次に例を示します。

       out.write(buf);    // Write remaining data
       buf.rewind();      // Rewind buffer
       buf.get(array);    // Copy data into array

      オーバーライド:
      クラスBufferrewind
      戻り値:
      このバッファ
    • slice

      public abstract MappedByteBuffer slice()
      このバッファの共有のサブシーケンスを内容とする新しいbyteバッファを作成します。

      新しいバッファの内容は、このバッファの現在位置から始まります。 このバッファの内容に変更を加えると、その内容が新しいバッファに反映されます。新しいバッファの内容に変更を加えると、その内容がこのバッファに反映されます。2つのバッファの位置、リミット、マークの値はそれぞれ異なります。

      新しいバッファの位置はゼロになり、その容量とその制限はこのバッファに残っているバイト数になり、そのマークは未定義になり、バイト順はBIG_ENDIANになります。 新しいバッファは、このバッファがダイレクト・バッファである場合にかぎりダイレクト・バッファになります。また、このバッファが読取り専用バッファである場合にかぎり読取り専用バッファになります。

      戻されたバッファでload()を呼び出して物理メモリーにバイトを読み込んだり、返されるバッファでforce()を呼び出してストレージ・デバイスにバイトを書き込むと、返されるバッファが表すこのバッファのサブ範囲(つまり、[position(),limit()))でのみ動作します。

      定義:
      クラスByteBufferslice
      戻り値:
      新しいbyteバッファ
      関連項目:
    • slice

      public abstract MappedByteBuffer slice(int index, int length)
      このバッファの共有のサブシーケンスを内容とする新しいbyteバッファを作成します。

      新しいバッファの内容は、このバッファ内のindexの位置から始まり、length要素が含まれます。 このバッファの内容に変更を加えると、その内容が新しいバッファに反映されます。新しいバッファの内容に変更を加えると、その内容がこのバッファに反映されます。2つのバッファの位置、リミット、マークの値はそれぞれ異なります。

      新しいバッファ位置はゼロ、容量とリミットはlength、マークは未定義、バイト順序はBIG_ENDIANになります。 新しいバッファは、このバッファがダイレクト・バッファである場合にかぎりダイレクト・バッファになります。また、このバッファが読取り専用バッファである場合にかぎり読取り専用バッファになります。

      戻されたバッファでload()を呼び出して物理メモリーにバイトを読み込んだり、返されたバッファでforce()を呼び出してストレージ・デバイスにバイトを書き込むと、返されるバッファが表すこのバッファのサブ範囲(つまり、indexおよびlengthは事前条件を満たしていると想定される)でのみ動作します。

      定義:
      クラスByteBufferslice
      パラメータ:
      index - 新しいバッファの内容が開始される、このバッファ内の位置。limit()以外の値である必要があります。
      length - 新規バッファに含まれる要素の数。負以外でlimit() - indexより大きい値である必要があります。
      戻り値:
      新しいバッファ
    • duplicate

      public abstract MappedByteBuffer duplicate()
      このバッファの内容を共有する新しいbyteバッファを作成します。

      新しいバッファの内容は、このバッファの内容と同じになります。 このバッファの内容に変更を加えると、その内容が新しいバッファに反映されます。新しいバッファの内容に変更を加えると、その内容がこのバッファに反映されます。2つのバッファの位置、リミット、マークの値はそれぞれ異なります。

      新しいバッファの容量、限界、位置、およびマークの値は、このバッファのものと同じになり、バイト・オーダーはBIG_ENDIANになります。 新しいバッファは、このバッファがダイレクト・バッファである場合にかぎりダイレクト・バッファになります。また、このバッファが読取り専用バッファである場合にかぎり読取り専用バッファになります。

      定義:
      クラスByteBufferduplicate
      戻り値:
      新しいbyteバッファ
    • compact

      public abstract MappedByteBuffer compact()
      このバッファを圧縮します  (オプションの操作)

      バッファの現在位置からリミットまでの間にbyteが存在する場合、これらをバッファの先頭にコピーします。 つまり、インデックス位置p = position()のbyteがインデックス・ゼロにコピーされ、インデックス位置p + 1のbyteがインデックス1にコピーされるということです。インデックス位置limit() - 1のbyteがインデックスn = limit() - 1 - pにコピーされるまで、同様の処理が繰り返されます。 最終的にバッファの位置はn+1に設定され、リミットは容量の値と等しくなります。 マークは破棄されます。

      バッファの位置は、ゼロではなく、コピーされるbyte数と等しくなります。したがって、このメソッドを呼び出したあと、すぐに別の相対「put」メソッドを呼び出すことができます。

      このメソッドは、書込みが終了しなかった場合にバッファからのデータの書込みを実行する前に呼び出します。 次のループは、バッファbufを使って、あるチャネルから別のチャネルにbyteをコピーします。

      
         buf.clear();          // Prepare buffer for use
         while (in.read(buf) >= 0 || buf.position != 0) {
             buf.flip();
             out.write(buf);
             buf.compact();    // In case of partial write
         }
       

      定義:
      クラスByteBuffercompact
      戻り値:
      このバッファ