本文原创,转载需标明原处。

通道,主要负责传输数据,相当于流,但流只能是输入或输出类型中的其一,而通道则可以兼并二者。

通道的基类是:Channel

  • boolean isOpen()
  • void close()

通道有同步方式和异步方式。

  • 同步方式:亲力亲为,不交给他人来做。
  • 异步方式:需要等待的事情,交给他人来做。做完之后,可以自己接着做,也可以由他人继续接着做。

通道有阻塞方式与非阻塞方式。

  • 阻塞方式:在做这件事时,可能需要等待,也可能不需要等待。
  • 非阻塞方式:在做这件事之前,确保不需要等待。换句话说,确保不需要等待的时候,我才来做。例如,银行人多的时候,我就直接离开,没人的时候,我就进入。

同步方式的输入输出通道

上图表示出,同步方式的输入输出通道的数据流通。这些通道的基类主要是ReadableByteChannel,WritableByteChannel。

  • ReadableByteChannel和WritableByteChannel,操作一个ByteBuffer进行读写字节数据。
  • ScatteringByteChannel和GatheringByteChannel分别是ReadableByteChannel,WritableByteChannel强化版,不仅可以操作一个ByteBuffer,还可以操作一组ByteBuffer。
  • FileChannel提供了更为快捷的操作,直接操作ReadableByteChannel和WritableByteChannel进行读写。
  • ByteChannel仅仅只是ReadableByteChannel和WritableByteChannel的组合,因此自然也是那些同时继承了ReadableByteChannel和WritableByteChannel的Channel的基类。
  • SeekableByteChannel(FileChannel是该类的唯一实现类),其表示不仅可以输入输出,还可以定位操作点,获取容量(文件大小)和缩减容量(文件大小)。

异步方式的输入输出通道

上图表示出,异步方式的输入输出通道的数据流通。

异步方式的具体通道类有两个,分别是AsynchronousSocketChannel和AsynchronousFileChannel。

输入输出通道

整合所有输入输出的通道,可以有五种源头类型的通道:文件,网络,管道,输入流,输出流。

可使用非阻塞方式的通道(以下简称可非阻塞通道)

这类通道的基类是SelectableChannel,默认是阻塞,通过方法configBlocking(boolean)设置是否阻塞,方法isBlocking()查看是否阻塞。

上图表示出具体的可非阻塞通道类,以及表示出非阻塞方式所使用到的各组件之间的关系图。

具体怎么使用,可以参考其它相关的文章,最重要还是记得一点,非阻塞的概念就是确保这件事情不需要等待的时候才去做。怎么确保,selector的select()系列方法,这些方法会阻塞,阻塞到它检测到那些事情不需要等待了,就会让我去做。

需要注意的是,在使用非阻塞方式的方法时,必须先使用configBlocking(false),设置为非阻塞。

异步方式的通道

异步的概念,就是把需要等待的事情,委托给他人来做,做完的时候,可以选择自己接着做,也可以继续由受委托的人接着做。

那么异步有两种结果,一种是自己接着做,一种是他人接着做。

自己接着做的方式,操作方法的返回值是一个Future对象,使用这个对象可以检测完成进度。

  • boolean isDone():测试是否完成。
  • boolean isCanceled():测试异步运行是否被中止。
  • boolean cannel(boolean):中止异步运行,并返回是否中止成功。
  • V get()/get(long, TimeUnit):有些操作需要获取运行的返回值,如读取时,需要知道读取的字节数。但如果异步运行未完成或未中止,就会进入阻塞。

他人接着做的方式,操作参数里需要传入一个CompletionHandler对象,这个对象的方法将由异步线程来调用。

  • void completed(V result, A attachment):完成时异步运行的方法。
  • void failed(Throwable exc, A attachment):失败时异步运行的方法。

异步方式的通道基类是AsynchronousChannel,但这个类仅仅只是一个身份类,并没有提供任何操作方法。它的子类有:

  • AsynchronousFileChannel
  • AsynchronousByteChannel:这是一个接口,表示不仅具有异步方式,同时是输入输出字节类型的通道。但唯一的实现类为AsynchronousSocketChannel。
  • AsynchronousServerSocketChannel
  • AsynchronousSocketChannel

其它通道

  • NetworkChannel:网络通道,用于网络的通道。
  • InterruptibleChannel:表示线程被中止时,可以中断输入输出的通道。

通道的建立

一般使用静态方法open建立,其它方式的建立,如下图:

待续更新……

IO通道的更多相关文章

  1. Java——新IO 通道

    import java.io.File; import java.io.FileOutputStream; import java.nio.ByteBuffer; import java.nio.ch ...

  2. [连载]《C#通讯(串口和网络)框架的设计与实现》- 5.串口和网络统一IO设计

    目       录 第五章           串口和网络统一IO设计... 2 5.1           统一IO接口... 2 5.1.1    串口IO.. 4 5.1.2    网络IO.. ...

  3. 系统间通信(5)——IO通信模型和JAVA实践 下篇

    7.异步IO 上面两篇文章中,我们分别讲解了阻塞式同步IO.非阻塞式同步IO.多路复用IO 这三种IO模型,以及JAVA对于这三种IO模型的支持.重点说明了IO模型是由操作系统提供支持,且这三种IO模 ...

  4. PythonCookBook笔记——文件与IO

    文件与IO 所有的程序都要处理输入与输出,涉及到文本.二进制文件.文件编码和对文件名.目录的操作. 读写文本数据 需要读写各种不同编码的文本数据,使用rt模式的open()函数. 该读写操作使用系统默 ...

  5. Java 知识笔记 - 类、集合、多线程、IO、JVM(最后一次更新,2019年02月17日)

    目录 Class 内部类.静态内部类.匿名内部类.局部内部类 Collection Java Collection Set Queue Map Collections Arrays System Co ...

  6. 操作系统-IO管理概述

    IO管理概述 一.IO设备 IO设备管理是操作系统设计中最凌乱也最具挑战性的部分.由于它包含了很多领域的不同设备以及与设备相关的应用程序,因此很难有一个通用且一直的设计方案.所以在理解设备管理之前,应 ...

  7. 为什么一个还没毕业的大学生能够把 IO 讲的这么好?

    Java IO 是一个庞大的知识体系,很多人学着学着就会学懵了,包括我在内也是如此,所以本文将会从 Java 的 BIO 开始,一步一步深入学习,引出 JDK1.4 之后出现的 NIO 技术,对比 N ...

  8. 一文带你熟悉JAVA IO这个看似很高冷的菇凉

    Java IO 是一个庞大的知识体系,很多人学着学着就会学懵了,包括我在内也是如此,所以本文将会从 Java 的 BIO 开始,一步一步深入学习,引出 JDK1.4 之后出现的 NIO 技术,对比 N ...

  9. 关于JAVA中顺序IO的基本操作

    关于JAVA中顺序IO的基本操作 写在前面 最近研究一下JAVA中的顺序IO,在网络上找了一会儿,发现少有详细的介绍,顾此在此处说说顺序IO,才学疏浅,如有不对,望赐教. 什么是顺序IO 事实上JAV ...

随机推荐

  1. Total Commander解压位置

    TC解压到当前文件夹下 TC也是用了一段时间,现在勉强也算用习惯了,今天在解压文件的时候感觉步骤麻烦,之前解压都是解压到另一个窗口,所以一直是ALT+8同步窗口,然后解压文件.但一般解压文件都是解压到 ...

  2. Ubuntu14.04或16.04下Hadoop及Spark的开发配置

    对于Hadoop和Spark的开发,最常用的还是Eclipse以及Intellij IDEA. 其中,Eclipse是免费开源的,基于Eclipse集成更多框架配置的还有MyEclipse.Intel ...

  3. 常用类-StringBuffer

    总结:凡是要频繁的修改字符串内容的时候,都要使用StringBuffer类来完成,而且在StringBuffer类里提供了一些在String类中没有的,包括:delete(),insert()等等 / ...

  4. ZK 使用jfreeChart

    前台: <?page title="Grid使用" contentType="text/html;charset=UTF-8"?> <zk x ...

  5. MySQL查询和删除重复数据

    删除表中重复记录,只保留一条: delete from 表名 where 字段ID in (select * from (select max(字段ID) from 表名 group by 重复的字段 ...

  6. SQL服务器在执行这条语句时会先进行运算然后执行

    1.打开地址,我们可以看到是一个正常的页面. 2..然后在地址后面加上-1,变成:http://site/news.asp?id=123-1,若返回的页面和前面不同,是另一个正常的页面,则表示存在注入 ...

  7. 谢欣伦 - OpenDev原创例程 - 网络摄像机WebCamera

    Win7没有预装摄像头软件,打开摄像头通常需要第三方软件来完成.第三方软件,好的要收费,免费的又没几款,其中功能完整的寥寥可数.正好我在做一个数字摄像头视频捕获的功能,经过两周的整理优化,我做了一个简 ...

  8. iOS开发——post异步网络请求封装

    IOS中有许多网络请求的函数,同步的,异步的,通过delegate异步回调的. 在做一个项目的时候,上网看了很多别人的例子,发现都没有一个简单的,方便的异步请求的封装例子.我这里要给出的封装代码,是异 ...

  9. Powershell 字符串处理案例

    有一张Excel表格收集了计算机名和IP地址,另外一张表有计算机名,需要找出这张表中计算机名对应的IP地址. #定义函数Get-LikeContentInfo function Get-LikeCon ...

  10. SQL Server出现错误: 4014

    SQL Server出现错误: 4014 线下的测试机器老是报错,从errorlog里看到大量的4014错误 A fatal error occurred , output error: ). 错误: ...