Java提供了哪些IO方式?NIO存在意义?

  IO一直是软件开发中的核心部分之一,而且随着互联网技术的提高,IO的重要性越来越重。纵观开发界,能够巧妙运用IO,不但对于公司形象,而且对于开发人员都非常的重要。Java的IO机制也是一直在不断的完善,以应对日见增多的流量。

 

简单说说几种Java IO方式

  首先,传统java.io提供了诸如File的抽象,输入,输出流。交互方式是同步,阻塞的方式。

  第二,在java 1.4中引入NIO框架(java.nio包),提供了Channel,Selector,Buffer等抽象,构建多路复用的,同步非阻塞IO,同时提供了更接近操作系统底层的高性能数据操作方式

  第三,在Java7中,NIO有了进一步的改进,也就是NIO 2。其引入了异步非阻塞IO方式,或者说AIO(Asynchronous IO)。异步IO基于事件和回调机制

 

点什么

  传统BIO,采用BIO编程通信模型的服务端,通常由一个独立的Acceptor线程负责监听客户端的连接。它接收到客户端连接请求之后为每个客户端创建一个新的线程进行链路处理,处理完成后,通过输出流返回给对应的客户端,线程销毁。

  ServerSocket负责绑定IP地址,启动监听端口;Socket负责发起链接操作。连接成功,双方通过输入和输出流进行同步阻塞式通信。

  ps, Java.net提供的API,如Socket,ServerSocket,HttpURLConnection也归与同步阻塞IO类库,因为网络通信同样是IO行为

  优点:代码简单,直观,维护方便

  缺点:IO效率极低,影响性能,却反弹性处理

  解决方法:线程池

  使用线程池管理线程,避免频繁创建,销毁线程的开销,但是其底层使用的依然式同步阻塞IO,通常被称为“伪异步IO模型”,可谓治标不治本。

 

看官留意

  IO不仅仅时对文件的操作,网络编程中,比如Socket通信也是典型的IO操作目

  输入流(InputStream),输出流(OutputStream),用于读取或写入字节的(在java中以Stream结尾)  

  而Reader/Writer操作字符,且增加了字符编解码等功能(在java中以Reader/Writer结尾)。本质上计算机操作的都是字节,不管是网络通信还是文件读取,Reader/Writer相当于构建了应用逻辑和原始数据之间的桥梁

  BufferdOutputStream,等带缓冲区的实现,可以避免频繁的磁盘读写,进而提高IO处理效率

 

区分异步和同步

  同步,就是一种可靠的有序运行机制,在进行同步操作时,后续的任务时等待当前调用返回,才会进行下一步

  异步,其他任务不需要等待当前调用是否返回,依靠事件,回调机制来实现任务调用

阻塞和非阻塞

  阻塞,当前线程处于阻塞状态,无法从事其他任务,只有当条件就绪才能继续

  非阻塞,不管IO操作是否结束,直接返回,相应的操作在后台继续处理

  

由此总结:同步和异步是结果,阻塞和非阻塞是过程

 

NIO(New IO)

       NIO的组成部分:

  1. Buffer  高效的数据容器,除了布尔类型,所有原始数据类型都有相应的Buffer实现
  2. Channel NIO中被用来支持批量式IO操作的一种抽象

            File/Socket,通常被认为是比较高层次的抽象,而Channel则是更加操作系统底层的一种抽象,这也使得NIO得以充分利用现代操作系统底层机制,进行性能优化

  1. Selector  是NIO实现多路复用的基础,它提供一种高效机制,检测到注册在Selector山的多个Channel中,是否有Channel处于就绪状态,进而现实单线程对多Channel的高效管理。也是基于操作系统底层机制
  2. Charset  提供Unicode字符串定义,NIO也提供了相应的编解码等

Java NIO和IO之间一个最大区别:IO是面向流的,NIO是面向缓冲区的

写在后面

主要参考资料,杨晓峰老师《Java核心技术36讲》

阿_毅《Java之IO,BIO,NIO,AIO知多少?》

猜你喜欢

转载自www.cnblogs.com/fuguoliang/p/9544960.html