1、标准I/O
InputStream和OutputStream作用于字节流,Reader和Writer作用于字符流。

JDK1.4引入新的I/O类库,旧的I/O包已经使用nio重新实现过,以便充分利用这种速度提高。
通道和缓存。我们可以把它相像成一个煤矿,通道是一个包含煤矿(数据)的矿藏,而缓冲器则是派送到矿藏的卡车。也就是说,我们并不是直接和通道交互,而只与缓冲交互,并把缓冲派到通道,获取数据或发送数据。


2、BIO
bio即block-I/O,同步阻塞式I/O

由代码可知,在while循环内服务端会调用accept方法等待接收客户端的连接请求,一旦一个请求连接,就可以建立通信套接字在这个通信套接字上进行读写操作,此时不能再接收其他客户端连接请求,只能等待同当前连接的客户端的操作执行完成,再进行下一次循环。此处可以使用线程池技术,提高并发,但随着连接的增多,将会消耗过多的内存资源,导致服务器变慢甚至崩溃。
3、NIO
nio即no-block I/O,同步非阻塞式IO

init操作是获取一个serverSocketChanel并注册到selector


run方法实际是对selector做遍历,监听事件(SelectionKey 有isReadable()、isWritable()、isConnectable()、isAcceptable())并处理。利用buffer作为程序与I/O的缓冲提高运行速度。
NIO较BIO的优势,通过selector轮询channel,选择就绪事件处理。当存在大量客户端连接请求时,服务器处理事件可以得到有效调控。
①客户端发起的连接请求是异步的,可以通过直接在多路复用器注册OP_CONNECT操作等待后续操作,不需要同步阻塞等待结果可用。
②SocketChannel的读写都是异步的,如果没有可读写的数据它不会同步等待,直接返回,这样IO通信线程可以处理其他链路,不要同步等待这个链路可用。
③线程模型的优化:由于JDK的Selector在Linux等主流OS中通过epoll实现,没有连接句柄数的限制,这意味着Selector线程可以同时处理成千上万的客户端连接,而且性能不会随着客户端的增加而线性下降,因此非常适合做高性能、高并发的网络服务器。
陈钊对这个过程在java bio,nio,aio及源码中讲解得还是比较清晰的。
参考:
1、《Java编程思想》
网友评论