- 3.1. チャネル(Channel)
- 3.2. ファイルチャネル(FileChannel)
- 3.3. MappedByteBuffer
- 3.4. ロック
3.3. MappedByteBuffer
MappedByteBufferは、ファイルの内容をメモリ上にマッピングしたダイレクトバッファです。ファイルの内容をメモリ上にマッピングすることによって、通常の入出力よりも高速にアクセスすることが可能になります。
ただし、1章のダイレクトバッファのところでも説明しましたが、ダイレクトバッファの生成にはある程度の時間がかかります。小さなファイルに使用しても全体としての速度は向上せず、逆に時間がかかってしまうこともあります。
MappedByteBufferは、FileChannelのmapメソッドを使用して生成することができます。
MappedByteBuffer map(FileChannel.MapMode mode, long position, long size)
ファイルの一部分だけをマッピングすることも可能です。positionとsizeで、ファイルのどの位置からどの長さだけマッピングするかを指定します。
modeにはマッピングのモードを指定します。マッピングのモードには次のものがあります。
モード |
説明 |
FileChannel.MapMode.READ_ONLY |
作成されるバッファは読み込み専用となります。 |
FileChannel.MapMode.READ_WRITE |
作成されるバッファは読み書き可能であり、書き込んだ結果はファイルに反映されます。 |
FileChannel.MapMode.PRIVATE |
作成されるバッファは読み書き可能ですが、書き込んだ結果はファイルに反映されません。 |
読み込みできないチャネルをREAD_ONLYモードでマッピングしようとしたり、読み書きできないチャネルをREAD_WRITEやPRIVATEモードでマッピングしようとした場合、例外が発生します。
MappedByteBufferはByteBufferを継承しており、以下のメソッドが追加されています。
- MappedByteBuffer force()
- boolean isLoaded()
- MappedByteBuffer load()
forceメソッドはMappedByteBufferに加えた変更を強制的にファイルに反映させるメソッドです。writeメソッド等によりMappedByteBufferに加えた変更がどのタイミングでファイルに反映されるかは実装依存ですが、forceメソッドを呼び出すことで強制的にファイルに書き込みを行うことができます。
isLoadedメソッドは、バッファの内容が物理メモリ上に存在するかどうかを返します。OSによっては仮想記憶の機能が使用されているような場合、データがメモリ上にあるように見えて実際はディスク上にしか存在していない場合があります。このメソッドはそのような状態を判別することができます。ただし、実際に状態をチェックしてからメソッドが戻り値を返すまでの間でも仮想メモリの状態がかわる可能性はありますので、戻り値が得られた時点でのメモリの状態と戻り値が食い違うこともありえます。
loadメソッドはバッファの内容をできるだけ物理メモリ上にロードしようとします。仮想メモリの機能によりデータがディスク上に退避されているような場合、データが物理メモリに書き戻されます。
(実習課題2)
実習課題1のプログラムを変更し、ファイルの読み込みでMappedByteBufferを使用するようにしてください。