- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
为什么在某些 JVM/OS 组合上 java.nio.FileChannel transferTo() 和 transferFrom() 比逐字节传输(基于流或使用 ByteBuffer)更快???
这些方法是否使用直接内存访问 (DMA) 而不是为每个字节传输发出中断请求 (IRQ)?
最佳答案
Do these methods use direct memory access (DMA) as opposed to issuing interrupt requests (IRQ) for each byte transfer?
具体以实际实现为准,不要求使用任何特定机制。 transferTo
的文档中暗示了这一点(重点是我的):
This method is potentially much more efficient than a simple loop that reads from this channel and writes to the target channel. Many operating systems can transfer bytes directly from the filesystem cache to the target channel without actually copying them.
“可能”、“很多”...所以无法保证。
假设使用该方法可能更有效是有道理的,即使只是略微如此,因为您允许 JVM 快捷方式通过 native 代码(如果使用受支持的 channel 类型)。他们描述的“简单循环”的工作原理如下所示:
ByteBuffer buf = ByteBuffer.allocateDirect(BUF_SIZE);
while ( /* read more condition */ ) {
source.read(buf);
buf.flip();
target.write(buf);
buf.compact();
}
请注意,即使此代码段使用直接缓冲区,您仍然需要回到 Java 中进行缓冲区管理(读取、翻转、写入、压缩)。优化编译器可能能够省略其中的一些,但它可能不会。
但是,使用transferTo
/transferFrom
将由 JVM 决定如何传输字节。如果平台对这种传输有原生支持,它可以在不创建中间缓冲区的情况下执行此操作。如果没有这样的支持,the JVM can still implement a loop such as above .
示例:假设 SocketChannel 被告知通过 transferFrom
直接从 FileChannel 读取数据。最近读取了 FileChannel,其内容在操作系统文件缓存中。 SocketChannel 可以直接指向操作系统文件缓存并从那里开始传输,而不是读取字节并将其复制到缓冲区中。至少消除了一轮复制。
现在进一步假设套接字 (A) 实际上连接到某个其他本地进程,例如使用一种称为 SocketChannel B 的管道。当 B 开始读取它从 A 获得的内容时,它实际上可能直接从操作系统文件缓存。如果 B 只是使用 transferTo
到另一个 channel ......你明白了。
关于jvm - 为什么 java.nio.FileChannel transferTo() 和 transferFrom() 更快???它使用DMA吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16451642/
我正在考虑更改 this question进入我的情况。然后我决定我的情况需要自己的问题并希望得到答案。在调用 FileChannel.truncate() 减小文件大小后,我调用 FileChann
我已阅读关于 FileChannel 的 transferFrom 的评论 * This method is potentially much more efficient than a simp
我必须按照小端顺序写一个整数。所以我创建了一个带有 FileChannel 属性和一些写入方法的类(此类不扩展任何内容)。 但是有一个问题:只有一种方法有效,另一种无效! 这里是工作方法(dis是Fi
以下是我将一个文件附加到另一个文件的方法。 public static void appendFile(File baseFile, File newFile) throws IOException
我正在创建一个 fileChannel 来执行内存映射写入。该文件 channel 的大小为 100 字节。我只向其中写入 80 个字节。因此,当我稍后读取该文件时,它会在 and 上添加 5 个“0
我有一个 IO 类,它使用 ByteBuffer 来缓冲对 FileChannel 的访问(因此它基本上在构造函数中接受 FileChannel)。我想对它进行单元测试,所以如果我能得到一个字节数组支
我是 Java NIO 新手。我发现 FileChannel 对象具有读取和写入方法。但我无法在单个时间点使用相同的 FileChannel 进行读写。有没有办法做到这一点? 最佳答案 从具有“rw”
使用 FileChannel.position() 从不同线程写入一个文件是否安全?这对于分段下载是必需的。每个线程都会写入其在文件中的位置,即线程的位置不会相交。 最佳答案 虽然单个选项是线程安全的
在读取大文件时,我从这段代码中得到了一些奇怪的输出,该文件是使用 while 循环打印到 99,999 位数的,但是,在读取文件并打印内容时,它只输出 99,988 行。另外,使用 ByteBuffe
我正在使用fileChannel.lock(long position, long size, boolean shared)获得文件特定部分的独占访问权限。具体代码为: fileChannel.lo
我尝试使用 FileChannel 将特定字节写入文件的特定位置。但实际上文件缩小到我写更改的最后位置。我这样做: Path path = Paths.get("I://music - Cop
我正在使用 FileChannel 将 2MB 数据写入文件。 private void write(int numEntries, int entrySize) throws Exc
我有一个管道,我需要从中读取数据。但是,正如我在阅读之前所了解的那样,我必须创建一定大小的缓冲区。问题是如何定义缓冲区的大小以从管道读取所有数据? 这是我的代码: RandomAccessFile a
我正在尝试使用以下方法连接一组文本文件。但是,只有第一个文件显示在输出文件中。 public void concatenateFiles(List fileLocations, String outp
当我执行以下类(class)时 import java.io.*; import java.nio.*; import java.nio.file.*; import java.nio.channel
我目前正在开发一个应用程序,需要随机访问许多(60k-100k)相对较大的文件。由于打开和关闭流是一项相当昂贵的操作,因此我更愿意将最大文件的 FileChannel 保持打开状态,直到不再需要它们为
我正在使用 RandomAccessFile 打开大文件(~ 200 MB),然后获取它的 Channel。我正在尝试将一些数据映射到 MappedByteBuffer,但出现异常: Channel
文件 a.txt 看起来像: ABC 文件 d.txt 看起来像: DEF 我正在尝试获取“DEF”并将其附加到“ABC”,因此 a.txt 看起来像 ABC DEF 我尝试过的方法总是完全覆盖第一个
对于我的特定任务,我需要从 FileChannel 中读取数据到 Stream (或 Collection )属于 String的。 在常规 NIO对于 Path我们可以使用一个方便的方法Files.
我想我误解了 FileChannel 的锁定功能是如何工作的。 我想在一个文件上拥有独占写入锁,但允许从任何进程读取。 在运行 Java 7 的 Windows 7 机器上,我可以使用 FileCha
我是一名优秀的程序员,十分优秀!