JAVA IO & NIO

什么叫IO

Java程序和外界交换数据的过程就叫做IO

NIO,AIO

目前大家一直使用NIO,因为快,里面有Channel,Selector和Buffer等新的抽象,构成同步非阻塞,在Java7,引入了NIO2,也叫做AIO(async IO),基于时间和回调机制,异步非阻塞

同步异步,阻塞非阻塞

同步异步好理解,调用方法一直等待返回就是同步,直接返回并通过时间或者回调就是异步。阻塞时当前线程会处于阻塞状态,无法从事其他任务,非阻塞则不管IO操作是否结束,直接返回。

转自https://www.jianshu.com/p/a6a38ed93fc2,阻塞式I/O, 非阻塞I/O, I/O复用由于都导致了请求进程阻塞,所以均属于同步I/O,总结的很好

不同IO模式

输入流和输出流

输入流、输出流(InputStream/OutputStream)是用于读取或写入字节的,Reader/Writer是基于字符操作的,构建了应用逻辑和原始数据之间的桥梁,BufferedOutputStream带缓冲区提高效率。IO类实现Closeable接口需要使用try-with-resources保证释放

NIO的组成部分

Buffer,搞笑的数据容器,Channel,类似文件描述符,是NIO总支持批量式IO的一种抽象,Selector是NIO实现多路复用的基础,可以检测到注册在Selector上的多个Channel是否处于就绪状态。NIO 则是利用了单线程轮询事件的机制,通过高效地定位就绪的 Channel,来决定做什么,仅仅 select 阶段是阻塞的,可以有效避免大量客户端连接时,频繁线程切换带来的问题

Select.open创建一个selector,类似调度员

创建ServerSockerChannel,注册到selector上,必须是非阻塞模式

selector阻塞在select方法上,当有channel连接时,被唤醒,然后通过SocketChannel和buffer进行写入/读取数据。

源代码 https://github.com/chaomao/LeetCodePractice/blob/master/src/main/java/BIODemoServer.java

你可能感兴趣的:(JAVA IO & NIO)