为什么.array()在从映射的FileChannels返回的ByteBuffer上不起作用?

vy3*_*y32 6 java bytebuffer memory-mapping

我正在用Java做内存映射的IO。FileChannel类允许您将ByteBuffer映射到文件的特定部分。我这样做是用只读方式打开的文件。

我遇到的问题是,当我尝试对生成的ByteBuffer调用.array()方法时遇到异常。也许是因为.array()返回byte []数组,而我真的想要一个最终的字节数组吗?

有没有办法解决?

coo*_*ird 3

我假设这是关于FileChannel.map可以将文件映射到可由MappedByteBuffer.

在该方法的文档中FileChannel.map,如果文件映射为只读,则任何修改缓冲区的尝试都将导致ReadOnlyBufferException

文件的一个区域可以通过以下三种模式之一映射到内存中:

  • 只读:任何修改结果缓冲区的尝试都会导致 ReadOnlyBufferException抛出异常。( MapMode.READ_ONLY)

就抛出的异常而言ByteBuffer.array,根据问题原因的不同,有两种类型的异常:

投掷:

  • ReadOnlyBufferException- 如果此缓冲区由数组支持但是只读的
  • UnsupportedOperationException- 如果此缓冲区没有可访问数组的支持

尽管问题中没有提到抛出的异常,但只读文件可能会导致ReadOnlyBufferException该方法抛出array异常。

另外,还应该提到的是,ByteBuffer.array方法是一个可选操作:

返回支持此缓冲区的字节数组(可选操作)。

为了确保该array方法将返回一个byte[]可以使用的方法,请hasArray按照文档中的建议调用该方法array

在调用此方法之前调用hasArray该方法,以确保此缓冲区具有可访问的后备数组。