图片来自于百度图片
NIO
专门为服务器而设计的API。能极大的提高IO的性能,避免使用大量线程。虽然是为了服务器而设计,但是依然可以被使用在客户端。
Channel(通道)
在标准IO中,直接操作的是stream(流);在NIO中使用的是Channel,Channel其实就是模拟了流的概念,只是比流的功能更加强大,性能更强。
通道必须和Buffer一起使用。
Channel相比Stream的主要优势体现在:
1、支持双向操作
2、异步操作
3、读写性能更高
Selector(选择器)
SelectableChannel对象的多路复用器,一个Selector可以监控多个通道,是NIO的核心。在此之前有必要给大家理一下几个主要使用的channel的主要关系。
主要继承关系
创建NIO的服务端
在标准IO中,我们的第一步是获取Socket,但是在NIO中,我们要创建相应的Channel:
在标准IO中,创建ServerSocket之后,就将此ServerSocket绑定到某端口,同理:
在标准IO中,到这里就开始使用accept的模式等到连接了,在NIO中,一样要设置以阻塞还是非阻塞模式:
还记得我们上面说过的seletor吗?它是SelectableChannel 对象的多路复用器,我们的ServerSocket不就是继承自SelectableChannel吗,所以这一步为注册ServerSocket:
在selector中注册的标记,主要有四种状态:
SelectionKey.OP_ACCEPT:可接收连接
SelectionKey.OP_CONNECT:可连接
SelectionKey.OP_READ:可读
SelectionKey.OP_WRITE:可写
我们需要另外开启一个线程来循环的发现Selector中是否有就绪的通道:
假定发现了一个就绪的通道,调用器selectedKeys方法会返回一个set集合,它包含了一个对应于就绪通道的SelectionKey对象:
如果就绪的通道是服务器通道,程序就会接受新的socket通道,并将通道注册进selector:
继续处理注册进来的新的通道:
一个服务端的程序终于写完了。由于受到篇幅的限制,完整的客户端和服务端的程序大家可以到此下载:https://pan.baidu.com/s/1kViUc9h
下期提要
下期开始,我们继续回归Android,将开始重点讲述Android中的图片和动画部分。敬请期待!
领取专属 10元无门槛券
私享最新 技术干货