代码之家  ›  专栏  ›  技术社区  ›  vy32

为什么.array()不能处理从map'ed filechannels返回的bytebuffers?

  •  4
  • vy32  · 技术社区  · 15 年前

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

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

    有办法解决这个问题吗?

    1 回复  |  直到 13 年前
        1
  •  3
  •   coobird    15 年前

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

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

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

    • 只读:任何修改尝试 产生的缓冲区将导致 只读BufferException 被扔掉 ( MapMode.READ_ONLY )

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

    投掷:

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

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

    此外,还应提到 字节缓冲数组 方法是可选操作:

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

    以确保 数组 方法将返回 byte[] 可以使用的,调用 hasArray 文件中建议的方法 数组 方法:

    调用 hasArray 方法前 调用此方法以便 确保此缓冲区具有 可访问的备用阵列。