NIO

NIO

IO NIO对比

java.io中最为核心的一个概念是流(Stream),面向流的编程。Java中,一个流要么是输入流,要么是输出流,不可能同时既是输入流又是输出流。

java.nio中有三个核心概念:Selector,Channel和Buffer。在java.nio中,我们是面向块(block)或是缓冲区(Buffer)编程的。Buffer本身就是一块内存,底层实现上,它实际上是个数组。数据的读、写都是通过Buffer来实现的。

除了数组之外,Buffer还提供了对于数据的结构化访问方式,并且可以追踪到系统的读写过程。

Java中的八种原生数据类型都有对应的Buffer类型,如IntBuffer,LongBuffer,ByteBuffer和CharBuffer等等。

Channel指的是可以向其写入数据或是从中读取数据的对象,它类似于java.io中的Stream

所有数据的读写都是通过Buffer来进行的,永远不会出现直接想Channel写入数据的情况,或者直接从Channel读取数据的情况。

与Stream不同的是,Channel是双向的,一个流只可能是InputStream或者是OutputStream,Channel打开后则可以进行读取、写入或者读写。

由于Channel是双向的,因此它能更好地反映出底层操作系统的真实情况;在Linux系统中,底层操作系统的通道是双向的。

##Nio Buffer##

关于Nio Buffer中的三个重要状态属性的含义:position,limit与capacity。

0 <= mark <= position <= limit <= capacity

通过NIO读取文件涉及到3个步骤:

  • 从FileInputStream获取到FileChannel对象。
  • 创建Buffer。
  • 将数据从Channel读取到Buffer中。

绝对方法和相对方法的含义:

  • 相对方法:limit值与position值会在操作时被考虑到。
  • 绝对方法:完全忽略掉limit值与position值。