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