これは、MappedByteBuffer
でアクセスできるメモリにファイルをマップできるFileChannel.map
メソッドに関するものと仮定します。 FileChannel.map
方法のドキュメントにおいて
ファイルが読み取り専用としてマッピングされている場合、バッファを変更する試みがReadOnlyBufferException
もたらすは:
ファイルの領域にマッピングされてもよいです3つのモードのいずれかで メモリ:
- 読み取り専用: を変更しようとすると、結果のバッファが
ReadOnlyBufferException
がスローされます。 ByteBuffer.array
方法によってスローされた例外の観点から (MapMode.READ_ONLY
)
、問題の原因に応じてスローされた例外の2種類がある:
例外:
ReadOnlyBufferException
- このバッファにはアレイが割り当てられているが、読み取り専用の場合
UnsupportedOperationException
- このバッファがアクセス可能な配列によって補助されていない場合
スローされた例外が問題に記載されていないが、おそらく、ファイルが読み取り専用さarray
方法によってスローされるReadOnlyBufferException
を引き起こしています。
このバッファ(オプション)を補助するバイト配列を返し
:
また、また、ByteBuffer.array
方法は、任意のオペレーションであることが言及されるべきです。
array
方法はarray
メソッドのドキュメントで提案されているようhasArray
メソッドを呼び出し、使用することができbyte[]
を返すことを確認するために:
は がこれを呼び出す前にhasArray
メソッドを呼び出しますメソッドを使用して、 にこのバッファに アクセス可能なバッキングアレイがあることを確認します。
もちろん、配列はメモリ内を移動し、ヘッダーを持つことがあります。このヘッダーは、メモリマップファイルや直接割り当てバッファには適していません。 –
もしそれらがメモリマップされていれば、移動されません。 – vy32
これは質問に答えますが、それは私が望む答えではありません。 POSIX mmap()はメモリマッピングを読み込み専用にしても問題ありません。 javaもそれを行う必要があります。 – vy32