一、java 中提供了那些IO方式?NIO如何实现多路复用?
java IO 方式有很多种,基于不同的IO抽象模型和交互方式,进行简单区分。
首先,传统的java.io 包,基于流模型实现,提供了我们最熟悉的一些IO功能,比如File抽象、输入输出流等。交互方式是同步、阻塞的方式,也就是说,在读取输入流或写入流时,在读、写动作完成前,线程会一直阻塞在那里,他们之间的调用是可靠地线性顺序。
java.io 包得好处是代码比较简单、直观、缺点是IO效率和扩展性存在局限性,容易成为使用时应用性能的瓶颈。
很多时候,人们把java.net 下面提供的部分网络API,比如Socke、ServerSocket、HttpURLConnection 也归类到同步阻塞IO类库,因为网络通信同样是IO行为。
第二,在java1.4中引入了NIO框架(java.nio包),提供了Channel、Selector、Buffer等新抽象,可以构建多路复用、同步非阻塞IO程序,同时提供了更接近操作系统的高性能数据操作方式。
第三,在java7 中,NIO有了进一步改进,也叫NIO2,引入了异步非阻塞的方式,也叫AIO(Asynchronous IO),异步操作基于事件和回调机制,简单理解为,应用操作直接返回,不会阻塞在那里,当后台处理完成时,操作系统会通知相应线程进行后续工作。
知识扩展:
首先澄清一些基本概念:
。区分同步异步(synchronous/asynchronous),简单说就是,同步是一种可靠地有序运行机制,当我们进行同步操作时,后续任务是等待当前调用返回,才会进行下一步;异步则相反,其他任务不需要等待当前调用返回,通常依靠事件、回调等机制来实现任务间次序关系
。区分阻塞非阻塞,当进行阻塞操作时,当前线程会出于阻塞状态,无法从事其他任务,只有当条件就绪才能继续,比如ServerSocket 新连接建立完毕,或数据读取、写入操作完成;而非阻塞则不管IO操作是否结束,直接返回,响应操作在后台完成。
这里还需要理解:
。IO不仅仅是对文件的操作,在网络编程中,比如Socket 通信,都是典型的IO操作目标;
。Reader/Writer则用于操作字符,增加字符编码等功能,适用于类似从文件中读取或者写入文本信息,本质上计算机操作的都是字节,不管是网络通信还是文件读取,Reader/writer 相当于构建了应用逻辑和原始数据之间的桥梁。
。BufferedOutputStream 等带缓冲区的实现,可以避免频繁的磁盘读写,进而提高IO处理效率。这种设计利用了缓冲区,将批量数据进行了一次操作,但在使用中千
万不要忘了flush.
.---------------------------------------------未完待续的分割线-----------------------------------------------------------