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

Cit*_*ron 2 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;
    
    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该类可以提高性能。使用面向流的抽象要比面向块的抽象容易得多。