Java NIO-Channel

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的示例


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Java NIO(New IO)是从Java 1.4版本开始引入的一个新的IO API,可以替代标准的Java I...
    JackChen1024阅读 12,252评论 1 143
  • 前言: 之前的文章《Java文件IO常用归纳》主要写了Java 标准IO要注意的细节和技巧,由于网上各种学习途径,...
    androidjp阅读 8,212评论 0 22
  • (转载说明:本文非原创,转载自http://ifeve.com/java-nio-all/) Java NIO: ...
    数独题阅读 4,206评论 0 3
  • (转载说明:本文非原创,转载自http://ifeve.com/java-nio-all/) Java NIO: ...
    柳岸阅读 4,225评论 0 3
  • 这两天了解了一下关于NIO方面的知识,网上关于这一块的介绍只是介绍了一下基本用法,没有系统的解释NIO与阻塞、非阻...
    Ruheng阅读 11,940评论 5 48

友情链接更多精彩内容