Java IO可以从三个方面理解,即硬盘、网络和终端,在这三个方向上都存在输入输出。然后根据处理模型的不同,Java的IO处理又可以划分为BIO、NIO和AIO。
一、java.io
从传输的内容的不同,总体上可以分为两大类,即字节流和字符流。
(一)字节流
A。输入流
这里又区分为节点流和处理流,由于处理流都是装饰器流,所以都会迭代在节点流之上工作。
B。输出流
输出流当然与输入流类似,节点流可以单独使用,但是处理流需要迭代节点流来使用
(二)字符流
我们都知道计算机其实只能存储0和1,或者说字节,这里之所以还有个字符流,只是为了方便使用,底层与终端真正交互肯定还是用的字节流。
也是一样的体系。一般建议使用处理流包装之后的节点流来处理数据,比较提供了更多的功能和灵活性。
二、Java BIO、Java NIO与Java AIO
从包空间来看,java.io中的类都是BIO,而java.nio中的类则既有NIO又有AIO。另外,还可以从同步异步以及阻塞非阻塞来理解。
同步与异步,这个主要是从接受者来区分。
- 同步就是发起一个请求后,接受者未处理完请求之前,不返回结果。
- 异步就是发起一个请求后,立刻得到接受者的回应表示已接收到请求,但是接受者并没有处理完,接受者通常依靠事件回调等机制来通知请求者其处理结果。
阻塞和非阻塞,这个主要从请求者来区分。
- 阻塞就是请求者发起一个请求,一直等待其请求结果返回,也就是当前线程会被挂起,无法从事其他任务,只有当条件就绪才能继续。
- 非阻塞就是请求者发起一个请求,不用一直等着结果返回,可以先去干其他事情,当条件就绪的时候,就自动回来。
而 BIO、NIO、AIO 就是同步与异步、阻塞与非阻塞的组合。
- BIO:同步阻塞 IO;
- NIO:同步非阻塞 IO;
- AIO:异步非阻塞 IO;
(一)Java BIO
采用 BIO 通信模型的服务端,通常由一个独立的 Acceptor 线程负责监听客户端的连接。如果要让 BIO 通信模型能够同时处理多个客户端请求,就必须使用多线程,也就是说它在接收到客户端连接请求之后为每个客户端创建一个新的线程进行链路处理,处理完成之后,通过输出流返回应答给客户端,线程销毁。
如果出现 100、1000、甚至 10000 个用户同时访问服务器,这个时候,如果使用这种模型,那么服务端也会创建与之相同的线程数量,线程数急剧膨胀可能会导致线程堆栈溢出、创建新线程失败等问题,最终导致进程宕机或者僵死,不能对外提供服务。
当然,我们可以通过使用 Java 中 ThreadPoolExecutor 线程池机制来改善,让线程的创建和回收成本相对较低,保证了系统有限的资源的控制,实现了 N (客户端请求数量)大于 M (处理客户端请求的线程数量)的伪异步 I/O 模型。
(二)Java NIO
NIO 中的 N 可以理解为 Non-blocking,NIO 新增了 Channel、Selector、Buffer 等抽象概念,支持面向缓冲、基于通道的 I/O 操作方法。NIO 引入了 Channel、Buffer 和 Selector 就把 IO 传输过程中涉及到的信息具体化,让程序员有机会去控制它们。
Channel 可以理解为通道,要比 Socket 更加具体。Buffer 类,你可以将它看作为 IO 中 Stream,在 Buffer 中,我们可以控制 Buffer 的 capacity(容量),并且是否扩容以及如何扩容都可以控制。Selector 被称为选择器 ,用于检查一个或多个 Channel(通道)的状态是否处于连接就绪、接受就绪、可读就绪、可写就绪。
但由于NIO编程复杂、编程模型难,很容易出现各类bug,维护成本高,所以使用门槛比较高。还好谷歌在NIO的基础上推出的Netty框架就比较好的解决了NIO的一些不足。
(三)Java AIO
AIO 全称 Asynchronous I/O,异步 IO,也被称为 NIO 2,它是异步非阻塞的 IO 模型,异步 IO 是基于事件和回调机制实现的,也就是应用操作之后会直接返回,不会堵塞在那里,当后台处理完成,操作系统会通知相应的线程进行后续的操作。
AIO用起来比较复杂,只有在一些非常复杂的分布式情况下使用,像集群之间的消息同步机制一般用这种 I/O 组合方式。在 开源框架Cassandra和Flink中都有AIO的应用。
参考https://mp.weixin.qq.com/s?__biz=MzU3NzczMTAzMg==&mid=2247486423&idx=1&sn=aa9ee8044961bb5dd7a345f434336cb8&chksm=fd016b60ca76e276770260d3045dcc2b7999cbebdb0963fcedfe23eb518ae8055fcee5eca8ab&mpshare=1&scene=24&srcid=&sharer_sharetime=1580635337730&sharer_shareid=904fe9378619edc63a81ef90022195da&key=bcf9fd249e299fb61652b2ec57b697365870bafff9e764e69db4c061c9b6655168887afc4046547b98fe12b985818c15a31eba7840ea3b555ca9e87bf6c4c574b23d6dc32ec86c7b68cf483188306b20&ascene=14&uin=MTA2MTYyNTc4Mw%3D%3D&devicetype=Windows+7&version=6208006f&lang=zh_CN&exportkey=ATnAtp%2FRV0dSog0tLCHTFxs%3D&pass_ticket=0km9xZCtst5qbGgLGXD41DWBglp%2Fs0uFxz9oFrIscYPfPJ9u09cKrZURooTeLQMA