Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么.array()不';t处理从map返回的ByteBuffers';文件频道?_Java_Bytebuffer_Memory Mapping - Fatal编程技术网

Java 为什么.array()不';t处理从map返回的ByteBuffers';文件频道?

Java 为什么.array()不';t处理从map返回的ByteBuffers';文件频道?,java,bytebuffer,memory-mapping,Java,Bytebuffer,Memory Mapping,我正在用Java做内存映射IO。FileChannel类允许您将ByteBuffer映射到文件的特定部分。我是用一个只读打开的文件来做这件事的 我遇到的问题是,当我试图对生成的ByteBuffer调用.array()方法时,遇到了一个异常。也许这是因为.array()返回一个byte[]数组,而我真的想要一个最终确定的byte数组 有什么办法可以解决这个问题吗?我假设这是一种方法,它可以将文件映射到内存,而内存可以被用户访问 在FileChannel.map方法的文档中,如果文件映射为只读,则任

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

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


有什么办法可以解决这个问题吗?

我假设这是一种方法,它可以将文件映射到内存,而内存可以被用户访问

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

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

  • 只读:任何修改的尝试 产生的缓冲区将导致 要引发的只读缓冲异常。 (
    MapMode.只读
就方法引发的异常而言,有两种类型的异常会根据问题的原因引发:

抛出:

  • ReadOnlyBufferException
    -如果此缓冲区由数组支持但为只读
  • UnsupportedOperationException
    -如果此缓冲区未由可访问阵列支持
尽管问题中没有提到抛出的异常,但可能是只读文件导致
数组
方法抛出异常

此外,还应提及,该方法是可选操作:

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

为确保
array
方法将返回可使用的
byte[]
,请按照
array
方法文档中的建议调用
hasaray
方法:

在之前调用该方法 调用此方法以 确保此缓冲区具有 可访问的备份阵列


当然,数组可能会在内存中移动,并且有一个标头,这与内存映射文件或直接分配的缓冲区不匹配。这确实回答了这个问题,但这不是我想要的答案。POSIX mmap()在只读内存映射方面没有问题。java也应该这样做。