6

我正在用 Java 做内存映射 IO。FileChannel 类允许您将 ByteBuffer 映射到文件的特定部分。我正在使用只读打开的文件来执行此操作。

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

有没有办法解决?

4

1 回答 1

3

我将假设这是关于FileChannel.map可以将文件映射到内存的方法,该内存可由MappedByteBuffer.

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

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

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

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

抛出:

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

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

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

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

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

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

于 2009-06-28T02:01:40.730 回答