1、java 中提供了那些IO方式?NIO如何实现多路复用?java
java IO 方式有不少种,基于不一样的IO抽象模型和交互方式,进行简单区分。编程
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),异步操做基于事件和回调机制,简单理解为,应用操做直接返回,不会阻塞在那里,当后台处理完成时,操做系统会通知相应线程进行后续工做。性能
知识扩展:编码
首先澄清一些基本概念:spa
。区分同步异步(synchronous/asynchronous),简单说就是,同步是一种可靠地有序运行机制,当咱们进行同步操做时,后续任务是等待当前调用返回,才会进行下一步;异步则相反,其余任务不须要等待当前调用返回,一般依靠事件、回调等机制来实现任务间次序关系操作系统
。区分阻塞非阻塞,当进行阻塞操做时,当前线程会出于阻塞状态,没法从事其余任务,只有当条件就绪才能继续,好比ServerSocket 新链接创建完毕,或数据读取、写入操做完成;而非阻塞则无论IO操做是否结束,直接返回,响应操做在后台完成。.net
这里还须要理解:
。IO不单单是对文件的操做,在网络编程中,好比Socket 通讯,都是典型的IO操做目标;
。Reader/Writer则用于操做字符,增长字符编码等功能,适用于相似从文件中读取或者写入文本信息,本质上计算机操做的都是字节,无论是网络通讯仍是文件读取,Reader/writer 至关于构建了应用逻辑和原始数据之间的桥梁。
。BufferedOutputStream 等带缓冲区的实现,能够避免频繁的磁盘读写,进而提升IO处理效率。这种设计利用了缓冲区,将批量数据进行了一次操做,但在使用中千
万不要忘了flush.
.---------------------------------------------未完待续的分割线-----------------------------------------------------------