阻塞IO
首先服务器端开启一个Socket监听固定端口(启动一个线程),等待客户端连接,等待和客户端建立连接(阻塞等待),从连接的数据流中读取数据,客户端下线后,服务器端的线程随之终止
服务端读取数据的时候,如果目前流中不存在数据,服务器处理线程空等。服务器切换线程,消耗时间,效率不高,网络传输基于流的方式效率不高
每个阻塞IO请求都会消耗线程池中的一个线程。
字节流的顶级父类为 : InputStream输入流 OutPutStream 输出流
FilterOutPutStream,.FilterInputStream ,BufferedOutPutStream, BufferedInputStream 属于过滤流,依赖于inputStream,OutPutSteam,使用修饰者模式,来包装节点留
修饰者模式:创建修饰类,用来包装原有的类,在保持方法签名的前提下,提供额外的功能。
字符流顶级父类为:Reader Writer
各种流是阻塞的,当一个线程调用read或者write方法时该线程被阻塞,直到有一些数据被读取或者被写入,在此期间该线程不能再做任何事
NIO
为所有的原始类型(Boolean类型除外),提供缓存支持的数据容器, 使用它可以提供非阻塞式的高伸缩性网络。
面向块的非阻塞
使用多路复用技术,做到同一个连接并发处理多个请求。
NIO是面向缓冲区的,数据读取到一个稍后处理的缓冲区,需要时可在缓冲区内前后移动,使用一个线程从某通道发送请求获取数据,它仅仅能得到目前可用数据,没有数据时什么都不会获取,直至数据变的可读之前线程可用继续做其他事情(线程请求立即返回)。