网络编程之Java的I/O之路

一、前言

       Java之所以能够得到如此广泛的应用,除了具有“一次编写,到处运行”的平台无关性之外,还有一个重要原因是:其丰富而强大的类库以及众多第三方开源类库使得Java语言的开发更加简单和便捷。

       但是,Java的一些类库在早期设计中功能并不完善或者存在一些缺陷,其中最令人恼火的就是基于同步I/OSocket通信类库。直到JDK1.4的发布,Java才第一次支持非阻塞I/O,这个类库的提供为JDK的通信模型带来了翻天覆地的变化。

二、I/O基础入门

       JDK1.4之前,Java对I/O的支持并不完善,开发人员在开发高性能I/O程序的时候,会面临一些巨大的挑战和困难。问题如下:

      ①没有数据缓冲区,I/O性能存在问题;

      ②没有C或者C++中的Channel概念,只有输入和输出流;

      ③同步阻塞式I/O通信(BIO) ,通常会导致通信线程被长时间阻塞;

      ④支持的字符集优先,硬件可移植性不好。

三、Linux网络I/O模型

       Linux内核将所有的外部设备都看做一个文件来操作,对一个文件的读写会调用内核提供的系统命令,返回一个file descriptor(fd,文件描述符)。当然对于一个socket的读写也会有响应的描述符,称为socketfd(socket  描述符),描述符就是一个数字,它指向内核中的一个结构体(文件路径,数据区等一些属性)。

        根据UNIX网络编程对I/O模型的分类,UNIX提供了5种I/O模型,分别为 阻塞I/O模型、非阻塞I/O模型、I/O复用模型、信号驱动I/O模型、异步I/O。

四、Java的I/O演进

         1、JDK1.4之前

         在JDK1.4推出Java  NIO之前,基于Java的所有Socket通信都采用同步阻塞模型(BIO),这种一请求一应答的通信模型简化了上层的应用开发,但是在性能和可靠性方面却存在着巨大的瓶颈。在很长一段时间内,大型的应用服务器都采用C或者C++语言开发,因为它们可以直接使用操作系统提供的异步I/O或者AIO能力。在JDK1.4之前,Java的I/O类库都非常原始,很多UNIX网络编程中的概念或者接口在I/O类库中都没有体现,例如Pipe、Channel、Buffer和Selector等。

         2、JDK1.4

         JDK1.4面世之后,新增了java.nio包,提供了很多进行异步I/O开发的API和类库,主要的类和接口如下。

        ①进行异步I/O操作的缓冲区ByteBuffer等;

        ②进行异步I/O操作的管道Pipe;

        ③进行各种I/O操作(异步或者同步)的Channel,包括服务端的ServerSocketChannel和客户端的SocketChannel;

        ④多种字符集的编码能力和解码能力;

        ⑤实现非阻塞I/O操作的多路复用器selector;

        ⑥基于流行的Perl实现的正则表达式类库;

        ⑦文件通道FileChannel

        新的NIO类库的提供,极大地促进了基于Java的异步非阻塞编程的发展和应用,但仍有不足之处,主要问题如下:

        ①没有统一的文件属性(例如读写权限)

        ②PI能力比较弱 

        ③底层存储系统的一些高级API无法使用;

        ④所有的文件操作都是同步阻塞调用,不支持文件读写操作。

       3.JDK1.7

        JDK1.7面世之后,将原来的NIO类库进行升级,被称为NIO2.0,也被称为AIO。它主要提供了三个方便的改进。

        ①提供能够批量获取文件属性的API,这些API具有平台无关性,不予特性的文件系统相耦合。另外它还提供了标准文件系统的SPI,供各个服务提供时扩展实现;

        ②提供AIO功能,支持基于文件的异步I/O操作和针对网络套接字的异步操作;

        ③完成JSR-51定义的通道功能,包括对配置和多播数据报的支持等。

五、总结

      大概了解UNIX网络编程的5种I/O模型,了解Java的I/O演进过程。BIO→NIO→NIO2.0,以及每个阶段存在的问题和对上一个阶段的完善。

    


       



         



       


评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值