2009-06-28 6 views
4

私はJavaでメモリマップIOをやっています。 FileChannelクラスを使用すると、ByteBufferをファイルの特定の部分にマップできます。私はそのファイルを読み取り専用で開いています。map'ed FileChannelsから返されたByteBuffersで、どのように.array()が機能しないのですか?

問題は、結果のByteBufferで.array()メソッドを呼び出そうとすると例外が発生することです。おそらくそれは.array()がbyte []配列を返すので、私は本当にfinalizeされたバイト配列が必要なのでしょうか?

これを回避する手段はありますか?

答えて

3

これは、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メソッドを呼び出しますメソッドを使用して、 にこのバッファに アクセス可能なバッキングアレイがあることを確認します。

+0

もちろん、配列はメモリ内を移動し、ヘッダーを持つことがあります。このヘッダーは、メモリマップファイルや直接割り当てバッファには適していません。 –

+0

もしそれらがメモリマップされていれば、移動されません。 – vy32

+0

これは質問に答えますが、それは私が望む答えではありません。 POSIX mmap()はメモリマッピングを読み込み専用にしても問題ありません。 javaもそれを行う必要があります。 – vy32

関連する問題