Java 1.4之前的早期版本,Java对IO的支持并不完善,Java的同步阻塞IO被大家所诟病,具体表现如下:
- 没有缓冲区,IO性能存在问题
- 没有C和C++的Channel、Pipe、Buffer、Selector,只有输入输出流
- 同步阻塞IO通信(BIO),通常导致通信的线程被长时间阻塞
- 支持的字符集有限,硬件可移植性差
2002年发布的JDK1.4,新增了java.nio包,提供了很多异步IO开发的API和类库,表现如下:
- 异步IO操作的缓冲区ByteBuffer、管道Pipe、Channel(ServerSocketChannel、SocketChannel)
- 多种字符的编解码
- 非阻塞IO的多路复用选择器Selector
- 基于流行的Perl实现的正则表达式
- 文件通道FileChannel
NIO极大促进了基于java的异步非阻塞编程的发展和引用,但是仍然有不完善的地方,特别是对文件系统的处理能力不足:
- 没有统一的文件属性(如读写权限)
- API能力比较弱,例如目录的级联创建和递归遍历,往往需要自己实现
- 底层存储系统的一些高级API无法使用
- 所有文件的操作都是同步阻塞调用,不支持异步文件读写操作
2011年 JDK1.7发布,对原有的NIO类库进行了升级,成为NIO2.0,表现:
- 提供了批量获取文件属性的API,这些API与平台无关,不与特性的文件系统相耦合,还提供了标准文件系统的SPI,供各个服务提供商扩展实现
- 提供了AIO,支持文件的异步和网络套接字的异步操作
- 完成了JSR-5.1定义的通道功能,包括配置的多播数据报的支持
网友评论