IO一直是软件开发中的核心部分之一,而随着互联网技术的提升,IO的重要性也愈来愈重。纵观开发界,可以巧妙运用IO,不但对于公司,并且对于开发人员都很是的重要。Java的IO机制也是一直在不断的完善,以应对日见增多的流量。java
Java IO的方式编程
首先,传统java.io包提供了诸如File的抽象,输入,输出流。交互方式是同步,阻塞;数组
第二,在java 1.4中引入NIO框架(java.nio包),提供了Channel,Selector,Buffer等抽象,构建多路复用的,同步非阻塞IO,同时提供了更接近操做系统底层的高性能数据操做方式;性能优化
第三,在Java 7中,NIO有了进一步的改进,也就是NIO 2。其引入了异步非阻塞IO方式,或者说AIO(Asynchronous IO)。异步IO基于事件和回调机制。网络
传统BIO框架
传统BIO,采用BIO编程通讯模型的服务端,一般由一个独立的Acceptor线程负责监听客户端的链接。它接收到客户端链接请求以后为每一个客户端建立一个新的线程进行链路处理,处理完成后,经过输出流返回给对应的客户端,而后销毁线程。异步
服务端提供IP地址和监听的端口,客户端经过TCP的三次握手与之链接,链接成功后,双方经过套接字通讯。函数
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,或者Non-Block IO,非阻塞同步模式。
设计原理:
1. 服务端与客户端经过Channel通讯;
2. NIO在Channel上读写;
3. Channel被注册到Selector多路复用器上。Selector经过一个线程轮询这些Channel,找出已经就绪的Channel。
NIO经过线程的轮询,实现非阻塞IO
NIO的组成部分:
1. Buffer 缓冲区;高效的数据容器
不一样的是BIO将数据直接读写到Stream对象中
NIO的数据操做都是在缓冲区中进行的
缓冲区其实是一个数组,常见类型ByteBuffer,CharBuffer,ShortBuffer,IntBuffer,LongBuffer,FloutBuffer,DoubleBuffer;
2. Channel 在NIO中被用来支持批量式IO操做的一种抽象,与流不一样,通道是双向的。
File/Socket,一般被认为是比较高层次的抽象,而Channel则是更加偏向操做系统底层的一种抽象,这也使得NIO得以充分利用现代操做系统底层机制,进行性能优化。分两大类:网络读写SelectableChannel(子类包括SocketChannel和ServerSocketChannel);文件操做(FileChannel);
3. Selector 是NIO实现多路复用的基础。它提供一种高效机制,不断轮询注册在其上的Channel,找出处于就绪状态,经过SelectionKey取得就绪的Channel集合,进行后续的IO操做。服务端只要提供一个负责Selector轮询的线程便可,实现单线程对多Channel的高效管理,也是基于操做系统底层机制;
4. Charset 提供Unicode字符串定义,NIO也提供了相应的编解码等。
Java NIO和IO之间一个最大区别:IO是面向流的,NIO是面向缓冲区的。
AIO (Asynchronous IO)
NIO 2 ,在Java 7提出,NIO的升级版。实现非阻塞异步的通讯模式;
提供异步文件通道和异步套接字通道;
其read,write方法的返回类型都是Future对象;
而Future模型是异步的,其核心思想是:去主函数等待时间;
基于事件和回调机制。
小结
IO,阻塞同步通讯模式,客户端与服务端三次握手,简单,吞吐量小。关键词:Socket和ServerSocket;
NIO,非阻塞同步通讯模式,客户端与服务端经过Channel链接,采用多路复用器轮询注册的Channel。关键词:SocketChannel 和 ServerSocketChannel;
AIO,非阻塞异步通讯模式,基于事件和回调机制,采用异步通道实现异步通讯。关键词:AsynchronousSocketChannel 和 AsynchronousServerSocketChannel。
写在后面
主要参考资料