Java NIO及核心组件

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.iojava.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之后,提供了更好的支持为:符号链接、文件属性的读取,以及专门支持通过PathPathsFiles类扩展文件系统。

java7还引入了异步IO:AsynchronousSocketChannelAsynchronousServerSocketChannelAsynchronousFileChannel

二、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事件的就绪状态。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值