文章目录
IO演进之路
从JDK1.0到JDK1.3, Java的I/O类库都非常原始,很多UNIX网络编程中的概念或者接口在I/O类库中都没有体现,例如Pipe、Channel、Buffer和Selector等。2002年发布JDK1.4时,NIO正式发布。它新増了个java.nio包,提供了很多进行异步I/O开发的API和类库,至此,Java的网络编程得到了大大提升。
1、JDK1.4之前
Java1.4之前的早期版本,Java所支持的IO就是我们平时一般指的IO----阻塞式IO。此时,Java对IO的支持并不完善,高性能服务器一般都是使用c++和c语言开发的。而阻塞式IO主要问题如下:
- 没有数据缓冲区,I/O性能存在问题;
- 没有Channel,只有输入流和输出流;
- 同步阻塞式I/O通信,在读写过程中通常会导致通信线程被长时间阻塞,极大地降低了性能;
- 高并发访问时,会产生大量线程,增大服务器的压力;
- 支持的字符集有限,硬件可移植性不好。
2、NIO的出现
JDK1.4新増了java.nio包,极大地促进了基于Java的非阻塞编程的发展和应用。NIO提供了很多新的类和接口:
- 缓冲区ByteBuffer等buffer类;
- 管道Pipe;
- 通道Channel,包括ServerSocketChannel 和 Socketchannel;
- 多路复用器selector;
- 多种字符集的编码、解码能力;
- 文件通道FileChannel。
3、AIO的出现
2011年7月28日,JDK1.7正式发布。它的一个比较大的亮点就是将原来的NIO类库进行了升级,被称为NIO2.0。NIO2.0由JSR.203演进而来,它主要提供了如下三个方面的改进:
- 提供能够批量获取文件属性的API,这些API具有平台无关性,不与特性的文件系统相耦合。另外它还提供了标准文件系统的SPI,供各个服务提供商扩展实现;
- 提供AIO功能,支持基于文件的异步I/O操作和针对网络套接字的异步操作;
- 完成JSR-51定义的通道功能,包括对配置和多播数据报的支持等。
此博客为读书笔记,参考书籍:《Netty权威指南》
有错误的地方敬请指出,欢迎大家评论区或者私信交流!每日持续更新Java、Python、大数据技术,请大家多多关注!