什么时候使用 FileChannel 读取()/写入()文件?
When Use FileChannel to read()/write() files?
我正在读 Thinking in 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?
只有两种情况 FileChannel
比 FileInputStream
或 FileOutputStream
快。
首先是您可以使用堆外 ("direct") ByteBuffer
来保存数据,这样它就不会被复制到 Java 堆中。例如,如果您正在编写一个将静态文件传送到套接字的网络服务器,那么使用 FileInputStream
和 SocketChannel
而不是 FileInputStream
和 [= 会更快17=].
在我看来,这些案例非常少见。通常,当您读取(或写入)Java 中的文件时,您将对数据执行某些操作。在这种情况下,您无法避免将数据复制到堆上。
FileChannel
的另一个用途是创建 MappedByteBuffer
以随机访问文件内容。这比使用 RandomAccessFile
快得多,因为它用利用 OS 分页机制的内存访问替换了对 OS 内核的显式调用。
如果您刚开始使用 Java 中的 I/O,我建议您坚持使用 java.io
中的 类,除非您能解释为什么切换到java.nio
会给你提高性能。使用面向流的抽象要比使用面向块的抽象容易得多。
我正在读 Thinking in 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?
只有两种情况 FileChannel
比 FileInputStream
或 FileOutputStream
快。
首先是您可以使用堆外 ("direct") ByteBuffer
来保存数据,这样它就不会被复制到 Java 堆中。例如,如果您正在编写一个将静态文件传送到套接字的网络服务器,那么使用 FileInputStream
和 SocketChannel
而不是 FileInputStream
和 [= 会更快17=].
在我看来,这些案例非常少见。通常,当您读取(或写入)Java 中的文件时,您将对数据执行某些操作。在这种情况下,您无法避免将数据复制到堆上。
FileChannel
的另一个用途是创建 MappedByteBuffer
以随机访问文件内容。这比使用 RandomAccessFile
快得多,因为它用利用 OS 分页机制的内存访问替换了对 OS 内核的显式调用。
如果您刚开始使用 Java 中的 I/O,我建议您坚持使用 java.io
中的 类,除非您能解释为什么切换到java.nio
会给你提高性能。使用面向流的抽象要比使用面向块的抽象容易得多。