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

クラスMappedByteBuffer

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

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

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

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

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

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

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

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

    • isLoaded

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

      戻り値trueは、このバッファ内のすべてのデータが物理メモリーに存在し、仮想メモリー・ページ・フォルトやI/O操作を発生させずにアクセスできる可能性が高いことを意味します。 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)
      このバッファの位置を設定します。 新しい位置の値よりもマークの値のほうが大きい場合、マークの定義は破棄されます。
      オーバーライド:
      クラスByteBufferposition
      パラメータ:
      newPosition - 新しい位置の値は、現在のリミット以下の負でない値でなければならない
      戻り値:
      このバッファ
      導入されたバージョン:
      9
    • limit

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

      public final MappedByteBuffer mark()
      このバッファの現在位置にマークを設定します。
      オーバーライド:
      クラスByteBuffermark
      戻り値:
      このバッファ
      導入されたバージョン:
      9
    • reset

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

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

      オーバーライド:
      クラスByteBufferreset
      戻り値:
      このバッファ
      導入されたバージョン:
      9
    • clear

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

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

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

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

      オーバーライド:
      クラスByteBufferclear
      戻り値:
      このバッファ
      導入されたバージョン:
      9
    • 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メソッドと組み合わせて使用することがあります。

      オーバーライド:
      クラスByteBufferflip
      戻り値:
      このバッファ
      導入されたバージョン:
      9
    • rewind

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

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

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

      オーバーライド:
      クラスByteBufferrewind
      戻り値:
      このバッファ
      導入されたバージョン:
      9
    • 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()のバイトは索引0にコピーされ、索引p + 1のバイトは索引1にコピーされ、索引limit()のバイトまでコピーされます-1が索引n = limit()にコピーされます-1-p. 最終的にバッファの位置はn+1に設定され、リミットは容量の値と等しくなります。 マークは破棄されます。

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

      このメソッドは、書込みが終了しなかった場合にバッファからのデータの書込みを実行する前に呼び出します。 たとえば、次のループでは、バッファbufを介してチャネル間でバイトをコピーします:

          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
      戻り値:
      このバッファ