什么时候使用 FileChannel 读取()/写入()文件?

When Use FileChannel to read()/write() files?

我正在读 Thinking in Java, 这本书解释了 java.nio.* 包并说 NIO 比传统的读写文件更快IO 流。为什么?

我查看了以下信息:

那么,什么时候使用NIO进行文件读写呢?为什么比传统IO更快?正确的使用方法是什么?只在读写文件时使用IO还是NIO?

只有两种情况 FileChannelFileInputStreamFileOutputStream 快。

首先是您可以使用堆外 ("direct") ByteBuffer 来保存数据,这样它就不会被复制到 Java 堆中。例如,如果您正在编写一个将静态文件传送到套接字的网络服务器,那么使用 FileInputStreamSocketChannel 而不是 FileInputStream 和 [= 会更快17=].

在我看来,这些案例非常少见。通常,当您读取(或写入)Java 中的文件时,您将对数据执行某些操作。在这种情况下,您无法避免将数据复制到堆上。

FileChannel 的另一个用途是创建 MappedByteBuffer 以随机访问文件内容。这比使用 RandomAccessFile 快得多,因为它用利用 OS 分页机制的内存访问替换了对 OS 内核的显式调用。

如果您刚开始使用 Java 中的 I/O,我建议您坚持使用 java.io 中的 类,除非您能解释为什么切换到java.nio 会给你提高性能。使用面向流的抽象要比使用面向块的抽象容易得多。