- 1.1. New I/O の概要
- 1.2. バッファ
- 1.3. バッファの作成方法
- 1.4. バッファの位置プロパティ
- 1.5. バッファの読み書き
- 1.6. ダイレクトバッファ
- 1.7. MappedByteBuffer
- 1.8. メモリ領域の割り当て
1.6. ダイレクトバッファ
ダイレクトバッファはNIOで新しく導入された機能です。これまでJavaでは、オブジェクトや配列などのデータは基本的に仮想マシンで管理される「ヒープ」という領域に作成されていました。ダイレクトバッファは「ヒープ」外のメモリ領域に作成され、入出力に高速なネイティブ操作が使用されるため、「ヒープ」上に作成される通常のバッファ(非ダイレクトバッファ)に比べて高速に入出力操作を実行できます。
ダイレクトバッファはByteBufferについてのみ作成することができます。他のプリミティブ型のバッファをダイレクトバッファとしたい場合は、ダイレクトバッファとして作成したByteBufferに対するビューを作成します。
ダイレクトバッファは、ByteBufferクラスのstaticメソッドであるallocateDirectメソッドにより作成できます。
static ByteBuffer allocateDirect(int capacity)
ByteBufferクラスには、バッファがダイレクトバッファであるかどうかを調べるisDirectメソッドが存在します。
ダイレクトバッファは非ダイレクトバッファに比べて高速に入出力できる反面、作成や削除の処理は非ダイレクトバッファより時間がかかります。したがって、ダイレクトバッファは容量の大きいバッファを必要とするときや、作成したバッファを繰り返し使用する場合に限って使用することが推奨されます。
1.7. MappedByteBuffer
MappedByteBufferはByteBufferのサブクラスであり、ファイルの内容をマップするためのダイレクトバイトバッファです。ファイルの全部または一部をダイレクトバッファとして扱えるメモリ上にマップします。
MappedByteBufferはjava.nio.channels.FileChannelクラスのmapメソッドによって作成することができます(FileChannelクラスについては後の章で説明します)。ここでは、読み込み専用のMappedByteBufferを作成する簡単なサンプルプログラムを示しておきます。
FileInputStream input = new FileInputStream("somefile"); FileChannel channel = new FileChannel(input); int length = (int)channel.size(); MappedByteBuffer buffer = channel.map(FileChannel.MapMode.READ_ONLY, 0, length);