什么时候使用FileChannel读取()/ write()文件?

时间:2018-11-15 02:27:52

标签: 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正在阻止读取,NIO可以是非阻止的,但是我发现文件NIO只能是非阻止的,那么NIO没有优势。

  • 我认为使用NIO通常是需要使用NIO的其他优点,例如:

     transferTo()/transferFrom()
    

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

1 个答案:

答案 0 :(得分:4)

在仅有两种情况下,FileChannelFileInputStreamFileOutputStream快。

第一个是可以使用堆(“直接”)ByteBuffer来保存数据,以便不将其复制到Java堆中的情况。例如,如果您正在编写将静态文件传递到套接字的Web服务器,则使用FileInputStreamSocketChannel而不是FileInputStream和{{ 1}}。

在我看来,这些案例很少而且相差甚远。通常,当您使用Java读取(或写入)文件时,您将对数据进行处理。在这种情况下,您无法避免将数据复制到堆上。

SocketOutputStream的另一个用途是创建一个FileChannel以随机访问文件的内容。这比使用MappedByteBuffer的速度要快得多,因为它将使用操作系统分页机制的内存访问替换对OS内核的显式调用。

如果您刚开始使用Java进行I / O,建议您坚持使用RandomAccessFile中的类,除非并且直到您能解释为什么切换到java.io会提高性能。使用面向流的抽象要比面向块的抽象容易得多。