Java NIO及核心组件
一、Java IO的演进
发现一篇讲Netty的文章:深入理解Netty。
在JDK1.4之前,在Java上所有的IO操作都是同步阻塞IO(BIO),因此那个时候对并发要求比较高的大型项目都用C/C++进行开发,因为C/C++可以直接使用操作系统提供的异步IO能力。
JDK1.4版本,提供了新的NIO类库,Java也可以支持非阻塞IO,称之为NIO。
JDK1.7版本,对NIO类库进行了升级,称之为NIO.2。
在Oracle JavaSE指导文档里,查到一篇文章:Java IO,NIO,NIO.2。
Java 的IO支持是在java.io 和java.nio 包下,目前这些包支持如下特性:
- 通过数据流(data streams)、序列化(serializable)和文件系统(file system)进行输入和输出;
- 字符集、编码器、解码器,用于在字节和Unicode字符之间转换;
- 访问文件、文件属性和文件系统;
- 用于使用一步或多路复用,非阻塞IO构建可扩展服务器的API;
1.1 Java NIO和Java NIO.2 的区别
Java最初通过在java.io 报中提供File类用于读取文件系统。这个类代表一个文件或文件夹,允许你去执行一些操作,例如:检查一个文件或目录是否存在,获取文件属性,删除操作。但是,它有一些缺点,如:
- 那个
File 类缺少一些重要的方法,例如:拷贝方法; File 类中定义的很多方法返回boolean类型,比如,一个错误出现,返回一个false,而不是抛出异常,开发这很难知道出错的确切原因;- 没有提供很好的支持在符号链接上;
- 提供了一个非常有限的文件属性集;
java.nio 包在java4中引入,关键特性如下:
- 管道(Channal)和选择器(Selectors):一个管道是在底层文件系统特性的抽象,例如,内存映射文件。
- 缓存(Buffers):缓存所有原始类(除了Boolean);
- 字符集(Charset)、编码器(encoders)、解码器(decoders),用于在字节和Unicode字符之间转换;
java7中引入了java.nio.file 之后,提供了更好的支持为:符号链接、文件属性的读取,以及专门支持通过Path 、Paths 、Files 类扩展文件系统。
java7还引入了异步IO:AsynchronousSocketChannel ,AsynchronousServerSocketChannel ,AsynchronousFileChannel 。
二、Java NIO上三个重要组件
Java NIO上有三个重要组件: Channel (通道),Buffer(缓冲区),Selector(选择器)。
(1)Channel
在OIO中,java的IO操作通过输入流(Input Stream)和输出流(Output Stream)进行输入和输出。JavaNIO中,Channel相当于输入流和输出流的结合体。既可以从Channel(通道)中读取,也可以向Channel(通道)写入。
(2)Buffer
对Channel(通道)的读取操作,就是把数据从通道读取到缓冲区;
对Channel(通道)的写入操作,就是将数据从缓冲区写入通道中;
(3)Selector
Selector对应“IO多路复用”模型中的select。它是一个IO事件的查询器,通过选择器,一个线程可以查询多个通道的IO事件的就绪状态。
|