我正在阅读《用Java思考》这本书,其中解释了java.nio.*
软件包,并说NIO比使用传统IO流读取和写入文件要快。为什么?
我已经查看了以下信息:
IO流是面向字节的,传统IO处理单元是字节,而NIO处理单元是块(字节阵列),但是我认为传统IO也可以通过BufferedFile *和传统方法直接处理块(字节阵列) IO也有直接的字节数组处理方法
private native int readBytes(byte b[], int off, int len) throws IOException;
IO正在阻止读取,NIO可以是非阻止的,但是我发现文件NIO只能是非阻止的,那么NIO没有优势。
我认为使用NIO通常是需要使用NIO的其他优点,例如:
transferTo()/transferFrom()
那么,什么时候应该使用NIO进行文件读写?为什么它比传统的IO更快?正确的使用方法是什么?我应该只在读写文件时使用IO还是NIO吗?
答案 0 :(得分:4)
在仅有两种情况下,FileChannel
比FileInputStream
或FileOutputStream
快。
第一个是可以使用堆(“直接”)ByteBuffer
来保存数据,以便不将其复制到Java堆中的情况。例如,如果您正在编写将静态文件传递到套接字的Web服务器,则使用FileInputStream
和SocketChannel
而不是FileInputStream
和{{ 1}}。
在我看来,这些案例很少而且相差甚远。通常,当您使用Java读取(或写入)文件时,您将对数据进行处理。在这种情况下,您无法避免将数据复制到堆上。
SocketOutputStream
的另一个用途是创建一个FileChannel
以随机访问文件的内容。这比使用MappedByteBuffer
的速度要快得多,因为它将使用操作系统分页机制的内存访问替换对OS内核的显式调用。
如果您刚开始使用Java进行I / O,建议您坚持使用RandomAccessFile
中的类,除非并且直到您能解释为什么切换到java.io
会提高性能。使用面向流的抽象要比面向块的抽象容易得多。