了解java.nio包中的通道

时间:2014-09-19 20:17:40

标签: java io buffer nio

对于直接映射缓冲区,它们总是保持在jvm堆之外。另一方面,通道似乎也存在于IO操作中。我只是想知道直接映射缓冲区的相应通道是否也在jvm堆之外?

另外,另一个问题来自于存储器操作效率方面存在Channel的必要性。我明白了

  

通道表示与实体(如硬件设备)的开放连接

然而,在通过直接映射缓冲区写入文件的情况下,内容是否被写入两次?首先将内容写入缓冲区,然后写入通道。这对于"直接"这是低效率吗?写入IO设备?

2 个答案:

答案 0 :(得分:0)

  

我只是想知道直接映射缓冲区的相应通道是否也停留在jvm堆之外?

这个问题没有意义。 Channel不是一块内存,它是操作系统FD的接口。

  

在通过直接映射缓冲区写入文件的情况下,内容被写入两次?首先将内容写入缓冲区,然后写入通道。与“直接”写入IO设备相比,这会是效率低吗?

没有。 MappedByteBuffer独立于它来自的频道。例如,当通道关闭时,它不会关闭。

您是否正在寻找直接字节缓冲区?它们确实存在,你通过通道写入它们,但通过它们的I / O发生一次,而不是两次。

答案 1 :(得分:-1)

我想我找到了答案。

直接映射缓冲区首先写入缓冲区,这是非IO操作。之后会发生用于更新文件的实际写入的IO操作。两次写入的原因是,由于我们有DMA,因此我们不希望所有IO操作都经常发生。一次性的所有IO操作都更有效。

通过JNI获取起始地址不是访问该内存的正确地址。相反,数据的地址是一个字段隐藏在java.nio.buffer中。获得这个领域的一种方法是通过sun.misc.Unsafe使该领域公开。