1

我已经阅读了关于FileChannel's的评论transferFrom

 * <p> This method is potentially much more efficient than a simple loop
 * that reads from the source channel and writes to this channel.  Many
 * operating systems can transfer bytes directly from the source channel
 * into the filesystem cache without actually copying them.  </p>

这是什么意思

Many operating systems can transfer bytes directly from the source channel
into the filesystem cache without actually copying them.

如果我从一个通道读取然后将其写入另一个通道,它不会将字节传输到缓存中吗?

4

1 回答 1

0

是的,如果您使用循环并从源通道读取到 ByteBuffer,然后将 ByteBuffer 写入 FileChannel,则字节/数据将在写入结束时位于文件系统缓存中。它们也将被复制到 Java ByteBuffer 中,并且可能是从内核复制到应用程序内存(或“C 堆”),然后复制到 JVM 堆(在最坏的情况下)。

如果源通道兼容,那么操作系统可能能够避免复制到 JVM 堆中,甚至可能完全脱离内核,而是直接从源文件页面复制到目标文件页面。

如果您将看到任何真正的性能改进将高度依赖于 JVM 版本、操作系统和文件系统。我不希望它表现得比 Java 编码循环更差。

抢。

于 2013-06-26T02:43:16.330 回答