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

3
我正在阅读《Java编程思想》这本书,其中讲解了java.nio.*包,并表示NIO比传统的IO流读写文件更快。为什么呢?
我已经查阅了以下信息:
  • IO stream is byte oriented, traditional IO processing unit is byte, and NIO processing unit is block (byte array), but I think traditional IO can also directly process block (byte array) through BufferedFile*, and traditional IO also has direct Method of processing byte array

    private native int readBytes(byte b[], int off, int len) throws IOException;
    
  • IO is blocking read, NIO can be non-blocking, but I found that the file NIO can only be non-blocking, then NIO has no advantage.

  • I think the need to use NIO is generally other advantages that need to use NIO, such as:

     transferTo()/transferFrom()
    

那么,何时应该使用NIO进行文件读写?为什么它比传统IO更快?正确的使用方式是什么?在读写文件时,我应该只使用IO还是NIO?


私有方法不是API的一部分。从缺乏非阻塞模式并不意味着“没有用”。这本书真的说“更快”吗?还是说“可以更快”?或者是“更具可扩展性”? - user207421
1个回答

8
只有两种情况下,FileChannelFileInputStreamFileOutputStream 更快。第一种情况是当您可以使用非堆内存(“直接”ByteBuffer)来保存数据,以便它不会被复制到 Java 堆中。例如,如果您正在编写一个将静态文件传递给套接字的 Web 服务器,则使用 FileInputStreamSocketChannel 要比使用 FileInputStreamSocketOutputStream 更快。在我看来,这些情况非常少见。通常,在 Java 中读取(或写入)文件时,您会对数据进行某些操作。在这种情况下,您无法避免将数据复制到堆上。
另一个使用 FileChannel 的方法是创建 MappedByteBuffer,以随机访问文件的内容。这比使用 RandomAccessFile 快得多,因为它用内存访问替换了显式调用操作系统内核,并利用了操作系统的分页机制。
如果您刚开始学习 Java I/O,我建议您坚持使用 java.io 中的类,除非您能够解释为什么切换到 java.nio 将提供更好的性能。使用面向流的抽象比使用面向块的抽象要容易得多。

谢谢你的回答,我非常赞同你的观点。看来我应该理解错书的含义。 - Citron

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接