Java 为什么.array()不';t处理从map返回的ByteBuffers';文件频道?
我正在用Java做内存映射IO。FileChannel类允许您将ByteBuffer映射到文件的特定部分。我是用一个只读打开的文件来做这件事的 我遇到的问题是,当我试图对生成的ByteBuffer调用.array()方法时,遇到了一个异常。也许这是因为.array()返回一个byte[]数组,而我真的想要一个最终确定的byte数组Java 为什么.array()不';t处理从map返回的ByteBuffers';文件频道?,java,bytebuffer,memory-mapping,Java,Bytebuffer,Memory Mapping,我正在用Java做内存映射IO。FileChannel类允许您将ByteBuffer映射到文件的特定部分。我是用一个只读打开的文件来做这件事的 我遇到的问题是,当我试图对生成的ByteBuffer调用.array()方法时,遇到了一个异常。也许这是因为.array()返回一个byte[]数组,而我真的想要一个最终确定的byte数组 有什么办法可以解决这个问题吗?我假设这是一种方法,它可以将文件映射到内存,而内存可以被用户访问 在FileChannel.map方法的文档中,如果文件映射为只读,则任
有什么办法可以解决这个问题吗?我假设这是一种方法,它可以将文件映射到内存,而内存可以被用户访问 在
FileChannel.map
方法的文档中,如果文件映射为只读,则任何修改缓冲区的尝试都将导致:
文件的一个区域可以映射到
三种模式之一的内存:
- 只读:任何修改的尝试
产生的缓冲区将导致
要引发的只读缓冲异常。
(
)MapMode.只读
-如果此缓冲区由数组支持但为只读ReadOnlyBufferException
-如果此缓冲区未由可访问阵列支持UnsupportedOperationException
数组
方法抛出异常
此外,还应提及,该方法是可选操作:
返回支持此操作的字节数组
缓冲区(可选操作)
为确保array
方法将返回可使用的byte[]
,请按照array
方法文档中的建议调用hasaray
方法:
在之前调用该方法
调用此方法以
确保此缓冲区具有
可访问的备份阵列
当然,数组可能会在内存中移动,并且有一个标头,这与内存映射文件或直接分配的缓冲区不匹配。这确实回答了这个问题,但这不是我想要的答案。POSIX mmap()在只读内存映射方面没有问题。java也应该这样做。