Channel(通道)是对原始IO对象的抽象,Channel的一端对应着一个原始IO对象,一端对应着一个Buffer对象。
特性
-
通道可以是单向的也可以是双向的(IO流对象读写都是单向的),一个通道实现了ReadableByteChannel接口那么这个通道就是可读的(read方法),实现了WritableByteChannel接口那么就是可写的(write方法);同时实现了两个接口就是双向通道,只实现一个接口就是单向通道。
每一个file或者socket通道都实现了上述的接口,都可以获取其对应的双向通道,但是需要注意的是socket通道是双向打开的,但是对于file来说只是从类的定义上来说是双向通道,但是在实际使用时并不是双向的,而是单向的,比如从FileInputStream对象获取FIleChannel,这个FIleChannel对象是只读的,即只能调用read方法,而不能调用write方法,当调用write方法将抛出NonWritableChannelException异常,这是因为FileInputStream总是以read-only权限打开的。
通道可以是异步的也可以是同步的。
通道可以是阻塞的也可以是非阻塞
阻塞IO会在read或者write方法处阻塞,直到有流可读或者将流写入操作系统完成,可以通过Channel.configureBlocking(false)设置为非阻塞(注意FileChannel不能切换为非阻塞模式,而套接字通道可以),非阻塞IO不会在read或者write方法或者accept方法处阻塞,而是会立刻返回。
常用的Channel类型
[异步]Channel
- [Asynchronous]FileChannel
FileChannel 从文件中读写数据
- [Asynchronous]DatagramChannel
DatagramChannel 能通过UDP读写网络中的数据
- [Asynchronous]SocketChannel
SocketChannel 能通过TCP读写网络中的数据
- [Asynchronous]ServerSocketChannel
ServerSocketChannel可以监听新进来的TCP连接,像Web服务器那样。对每一个新进来的连接都会创建一个SocketChannel
使用示例
FileChannel和MappedByteBuffer的示例