NIO学习笔记(五)通道概述

NIO学习笔记(五)通道概述

1、什么是通道?

什么是通道呢?首先我们来看一下百度百科的解释:

通道是一个计算机词汇,属于操作码,记数段,内存地址段等。能够完成内存与外设之间数据的传输。一个独立于CPU的专门I/O控制的处理机,控制设备与内存直接进行数据交换。它有自己的通道命令,可由CPU执行相应指令来启动通道,并在操作结束时向CPU发出中断信号。通道指令的格式一般由:操作码,记数段,内存地址段,结束标志组成。一个系统中可设立三种类型的通道:字节多路通道、数组多路通道、选择通道。

百度百科的解释还是非常的不讲道理啊,没有一点人情味。用概念解释概念,看完了也不太理解。其实说白了,通道就是用来传输数据的通路。

NIO技术中的通道类就类似于中国古代的丝绸之路,在丝绸之路上运输商品。那么NIO的技术中,可以在通道上传输原缓冲区和目的缓冲区要交互的数据。

2、通道的概述

在NIO中,我们可以发现缓冲区的类型都是类,而通道的类型都是接口。这是由于通道的功能实现是要依赖于操作系统的。Channel接口只定义了有哪些功能,但是功能的具体实现在不同的操作系统中是不一样的,因此JDK将通道设计成接口数据类型。

那么我们接下来就来看一看这个Channel。

public interface Channel extends Closeable

我们可以看到这个Channel是Closeable的子接口

public interface Closeable extends AutoCloseable

点进Closeable我们可以看到这个Closeable是AutoCloseable的子接口。

AutoCloseable这个接口的作用时是可以自动关闭,不需要显示的调用close()方法。接下来我们来看一个小小的例子:

public class AutoCloseDemo {
    public static void main(String[] args) {
        try(DBOperate dbOperate = new DBOperate()){
            System.out.println("使用"+dbOperate+"开始数据库操作");
        }catch (Exception e){
            e.printStackTrace();
        }
    }
}

class DBOperate implements  AutoCloseable{

    @Override
    public void close() throws Exception {
        System.out.println("关闭连接");
    }
}

DBOperate类实现了AutoCloseable接口,使DBOperate类具有close()方法自动关闭资源的功能。AutoCloseable接口强调的是与try()结合实现自动关闭,该接口针对的是任何资源,不仅仅是IO。该接口不要求幂等,也就是重复调用接口的close方法会出现副作用。

幂等性:就是用户对于同一操作发起的一次请求或者多次请求的结果是一致的,不会因为多次点击而产生了副作用。

但是AutoCloseable的子接口Closeable的close方法是幂等的,可以重复地调用close方法却不会出现任何效果和影响。Closeable接口继承自AutoCloseable接口,说明Closeable既有自动关闭的功能,又有手动关闭的功能。

通道是用于I/O操作的连接,更具体的讲,通道代表数据到硬件设备、文件、网络套接字的连接。通道可以处于倒开或者关闭这两种状态。当创建通道时,通道就处于打开状态,一旦将其关闭,则保持关闭状态。一旦关闭了某个通道,则试图对其调用I/O操作时就会导致CloseChannelException异常抛出,但可以通过调用通道的isOpen()方法测试通道是否处于打开状态,避免异常。一般情况下,通道对于多线程访问是线程安全的。

在JDK1.8当中Channel有11个子接口,接下来我们来一一介绍。

3、图解Channel的子接口

通道的接口各有各的实现和继承关系,众多的接口与类结构似乎很那看出规律性。这里放一张图,让大家看清楚他们的层级关系。

在这里插入图片描述

  1. AsynchronousChannel这个接口的主要作用是使通道具有异步I/O的作用。异步通道在多线程并发的情况下是线程安全的。某些通道的实现是可以支持并发操作的,但是不允许在一个未完成的IO操作上再次调用读写操作。
  2. AsynchronousByteChannel接口的主要作用是使通道支持异步操作,操作单位为字节。
  3. ReadableByteChannel主要的作用是允许对字节进行读操作。且执行读操作是同步读。接口只允许一个读操作在进行,如果一个线程正在进行读操作,那么任何试图发起读操作的线程都会被阻塞。
  4. ScatteringByteChannel主要的作用是可以从通道中读取字节到多个缓冲区
  5. WritableByteChannel主要的作用是使通道允许对字节进行写操作。
  6. GatheringByteChannel主要的作用是将多个缓冲区中的数据写入到通道中。
  7. ByteChannel主要的作用是将ReadableByteChannel和WritableByteChannel的规范进行统一,也就是ByteChannel接口的父接口就是ReadableByteChannel和WritableByteChannel。ByteChannel接口没有添加任何新的方法。
  8. SeekableByteChannel接口的主要作用是在字节通道中维护position,以及允许position发生改变。
  9. NetworkChannel主要作用是使通道与Socket进行关联,是通道上的数据可以再Socket上传输。
  10. MulticastChannel接口的主要作用是使通道支持IP多播。IP多播就是将主机地址进行打包,然后将IP报文向着个组进行发送,也就相当于同时向多个主机传输数据。
  11. InterruptibleChannel接口的主要作用是使通道能够以异步的方式进行关闭与中断。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值