Java 何时使用FileChannel读取()/写入()文件?
我正在阅读《用Java思考》一书,该书解释了Java 何时使用FileChannel读取()/写入()文件?,java,nio,java-io,Java,Nio,Java Io,我正在阅读《用Java思考》一书,该书解释了Java.nio.*包,并说nio比用传统IO流读写文件更快。为什么? 我已审阅了以下信息: IO流是面向字节的,传统IO处理单元是字节,NIO处理单元是块(字节数组),但我认为传统IO也可以通过BufferedFile*直接处理块(字节数组),传统IO也有直接处理字节数组的方法 private native int readBytes(byte b[], int off, int len) throws IOException; IO是阻塞读取
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吗?只有两种情况下
文件通道
比文件输入流
或文件输出流
快
第一种情况是,可以使用堆外(“direct”)ByteBuffer
保存数据,这样就不会将数据复制到Java堆中。例如,如果您正在编写一个向套接字交付静态文件的web服务器,那么使用FileInputStream
和SocketChannel
比使用FileInputStream
和SocketOutputStream
更快
在我看来,这些案例非常少。通常,当您用Java读取(或写入)文件时,您将对数据进行处理。在这种情况下,您无法避免将数据复制到堆中
FileChannel
的另一个用途是创建一个MappedByteBuffer
,用于随机访问文件内容。这比使用RandomAccessFile
要快得多,因为它用利用操作系统分页机制的内存访问来替换对操作系统内核的显式调用
如果您刚刚开始使用Java中的I/O,我建议您坚持使用
Java.io
中的类,除非您能够解释为什么切换到Java.nio
会提高性能。使用面向流的抽象比使用面向块的抽象容易得多。私有方法不是API的一部分。”由于缺乏非阻塞模式,因此“不有用”。这本书真的说“更快”吗?或者“可以更快”?还是“更具可扩展性”?谢谢你的回答,我也非常同意你的观点。看来我应该理解错书的意思了。