我正在用 Java 做内存映射 IO。FileChannel 类允许您将 ByteBuffer 映射到文件的特定部分。我正在使用只读打开的文件来执行此操作。
我遇到的问题是,当我尝试在生成的 ByteBuffer 上调用 .array() 方法时出现异常。也许那是因为 .array() 返回一个 byte[] 数组,而我真的想要一个最终的字节数组?
有没有办法解决?
我正在用 Java 做内存映射 IO。FileChannel 类允许您将 ByteBuffer 映射到文件的特定部分。我正在使用只读打开的文件来执行此操作。
我遇到的问题是,当我尝试在生成的 ByteBuffer 上调用 .array() 方法时出现异常。也许那是因为 .array() 返回一个 byte[] 数组,而我真的想要一个最终的字节数组?
有没有办法解决?
我将假设这是关于FileChannel.map可以将文件映射到内存的方法,该内存可由MappedByteBuffer.
在该FileChannel.map方法的文档中,如果文件被映射为只读,则任何修改缓冲区的尝试都将导致ReadOnlyBufferException:
文件的一个区域可以通过以下三种模式之一映射到内存中:
- 只读:任何修改结果缓冲区的尝试都将导致 a
ReadOnlyBufferException被抛出。(MapMode.READ_ONLY)
就ByteBuffer.array方法抛出的异常而言,根据问题的原因,有两种类型的异常抛出:
抛出:
ReadOnlyBufferException- 如果此缓冲区由数组支持但为只读UnsupportedOperationException- 如果此缓冲区没有可访问数组的支持
尽管问题中没有提到抛出的异常,但可能是只读文件导致该方法ReadOnlyBufferException抛出异常array。
另外,还应该提到该ByteBuffer.array方法是可选操作:
返回支持此缓冲区的字节数组(可选操作)。
为了确保该array方法将返回一个byte[]可以使用的hasArray方法,请按照该方法的文档中的建议调用该array方法:
在调用
hasArray此方法之前调用该方法,以确保此缓冲区具有可访问的后备数组。