Java NIO-Channel

2017-06-30  本文已影响0人  zhanglbjames

Channel(通道)是对原始IO对象的抽象,Channel的一端对应着一个原始IO对象,一端对应着一个Buffer对象。

特性

  1. 通道可以是单向的也可以是双向的(IO流对象读写都是单向的),一个通道实现了ReadableByteChannel接口那么这个通道就是可读的(read方法),实现了WritableByteChannel接口那么就是可写的(write方法);同时实现了两个接口就是双向通道,只实现一个接口就是单向通道。


  2. 每一个file或者socket通道都实现了上述的接口,都可以获取其对应的双向通道,但是需要注意的是socket通道是双向打开的,但是对于file来说只是从类的定义上来说是双向通道,但是在实际使用时并不是双向的,而是单向的,比如从FileInputStream对象获取FIleChannel,这个FIleChannel对象是只读的,即只能调用read方法,而不能调用write方法,当调用write方法将抛出NonWritableChannelException异常,这是因为FileInputStream总是以read-only权限打开的。

  3. 通道可以是异步的也可以是同步的。

  4. 通道可以是阻塞的也可以是非阻塞

阻塞IO会在read或者write方法处阻塞,直到有流可读或者将流写入操作系统完成,可以通过Channel.configureBlocking(false)设置为非阻塞(注意FileChannel不能切换为非阻塞模式,而套接字通道可以)非阻塞IO不会在read或者write方法或者accept方法处阻塞,而是会立刻返回。

常用的Channel类型

[异步]Channel

  1. [Asynchronous]FileChannel

FileChannel 从文件中读写数据

  1. [Asynchronous]DatagramChannel

DatagramChannel 能通过UDP读写网络中的数据

  1. [Asynchronous]SocketChannel

SocketChannel 能通过TCP读写网络中的数据

  1. [Asynchronous]ServerSocketChannel

ServerSocketChannel可以监听新进来的TCP连接,像Web服务器那样。对每一个新进来的连接都会创建一个SocketChannel

使用示例

FileChannel和MappedByteBuffer的示例


上一篇下一篇

猜你喜欢

热点阅读