Channel接口的层次结构解析

Channel阅读笔记

镇楼:Channel接口的层次结构

在这里插入图片描述

  • 可点击上图放大
  • 在NIO技术中,通道是核心要点。要讲操作的数据打包到缓冲区中,而缓冲区的数据想要传输到目的地是要依赖于通道的。缓冲区是将数据进行打包,而通道是讲数据进行传输,可见两者是形影不离的。他们也是NIO技术中比较重要的知识点。

镇楼:Channel接口解析

在这里插入图片描述

  • AutoCloseable接口的作用是可以自动该关闭,不需要显示的调用close方法,例如try-with-resource

    // 可以支持1.7的新特性try-with-resources,在抛异常或finally之前会执行此重写函数
    public class ChannelTest implements AutoCloseable {
        public static void main(String[] args) {
            try (ChannelTest channelTest = new ChannelTest()) {
                System.out.println("todo");
                throw new Exception();
            } catch (Exception e) {
                System.out.println("catch");
                e.printStackTrace();
            }finally {
                System.out.println("finally");
            }
        }
    
        @Override
        public void close() throws Exception {
            System.out.println("自动关闭");
        }
    }
    /*
    todo
    自动关闭
    catch
    java.lang.Exception
    	at com.kylin.socket.ChannelTest.main(ChannelTest.java:14)
    finally
    */
    
  • Closeable接口的作用是关闭I/O流,释放系统资源,所以抛出IO异常。并且该方法是幂等的,重复调用也不会出现任何的效果和影响。因为继承了AutoCloseable,所以本身的close也是具有自动关闭的功能

  • Channel自身接口有一个抽象方法isOpen方法测试通道是否处于打开状态,避免出现ClosedChannelException异常

PS:注意以下只是说rt.java包下的

一、AsynchronousChannel接口

主要作用是使通道支持异步I/O操作.

1、查看jdkdoc文档
2、查看类图关系

-在这里插入图片描述

3、抽象方法
  • void close() throws IOException;

二、AsynchronousByteChannel接口

主要作用是使通道支持异步I/O操作,操作单位为字节

read和write方法在上一个未完成的时候再次调用会抛出异常,其他I/O操作是否可以同时进行read操作,取决于通道的类型或实现,ByteBuffer类不是线程安全的

1、查看jdkdoc文档
2、查看类图关系
  • 在这里插入图片描述
3、抽象方法
  • <A> void read(ByteBuffer dst,A attachment,CompletionHandler<Integer,? super A> handler);

  • Future<Integer> read(ByteBuffer dst);读数据到dst,采用future接受结果

  • <A> void write(ByteBuffer src,A attachment,CompletionHandler<Integer,? super A> handler);

  • Future<Integer> write(ByteBuffer src);

三、ReadableByteChannel接口

主要作用是使通道允许对字节进行读操作,

1、查看jdkdoc文档
2、查看类图关系
  • 在这里插入图片描述
3、抽象方法
  • public int read(ByteBuffer dst) throws IOException;
    • 从通道中读取数据到dst缓存区,只允许有1个读操作在进行,如果1个线程正在1个通道上执行1个read()操作,那么任何试图发起另一个read()操作的线程都会被阻塞,直到第一个read()操作完成。其它类型的I/O操作是否可以与read()操作同时进行,取决于通道的类型。所以它是同步的。

四、ScatteringByteChannel接口

主要作用是可以从通道中读取字节到多个缓冲区

1、查看jdkdoc文档
2、查看类图关系
  • 在这里插入图片描述
3、抽象方法
  • public long read(ByteBuffer[] dsts, int offset, int length)throws IOException;
  • public long read(ByteBuffer[] dsts) throws IOException;

五、WritableByteChannel接口

主要作用是使通道允许对字节进行写操作

1、查看jdkdoc文档
2、查看类图关系
  • 在这里插入图片描述
3、抽象方法
  • public int write(ByteBuffer src) throws IOException;
    • 将1个字节缓存区的字节序列写入通道的当前位置;
    • 方法是同步的

六、GatheringByteChannel接口

主要作用是可以将多个缓冲区中的数据写入到通道中

1、查看jdkdoc文档
2、查看类图关系
  • 在这里插入图片描述
3、抽象方法

七、ByteChannel接口

主要作用是讲ReadableByteChannel(可读字节通道)和WritableByteChannel(可写字节通道)的规范进行统一,也就是ByteChannel接口的父接口就是ReadableByteChannel和WritableByteChannel。

1、查看jdkdoc文档
2、查看类图关系
  • 在这里插入图片描述
3、抽象方法
  • 无,直接具有父类的read和write方法

八、SeekableByteChannel接口

主要作用是在字节通道中维护position(位置),以及允许position发生改变

1、查看jdkdoc文档
2、查看类图关系
  • 在这里插入图片描述
3、抽象方法
  • int read(ByteBuffer dst) throws IOException;继承父类
  • int write(ByteBuffer src) throws IOException;继承父类
  • long position() throws IOException;返回此通道的position位置
  • SeekableByteChannel position(long newPosition) throws IOException;
    • 设置此通道的position位置
  • long size() throws IOException;
    • 返回连接到此通道的实体大小
  • SeekableByteChannel truncate(long size) throws IOException;
    • 截断文件,size为截断的字节数量,截断之后size之后的数据都丢失
    • 例如:raf.getChannel().truncate(file.length()-4);

九、NetworkChannal接口

使通道与Socket进行关联,使通道中的数据能在Socket技术上进行传输

1、查看jdkdoc文档
2、查看类图关系
  • 在这里插入图片描述
3、抽象方法
  • NetworkChannel bind(SocketAddress local) throws IOException;
    • 将Socket绑定到本地地址
  • SocketAddress getLocalAddress() throws IOException;
    • 返回绑定到此Socket中的SocketAddress地址
  • <T> NetworkChannel setOption(SocketOption<T> name, T value) throws IOException;
    • 设置套接字选项集
  • <T> T getOption(SocketOption<T> name) throws IOException;
    • 返回套接字选项的值
  • Set<SocketOption<?>> supportedOptions();
    • 返回此通道支持的套接字选项集

十、MulticastChannal接口

主要作用是使通道支持Internet Protocol(IP)多播

IP多播:就是将多个主机地址进行打包,形成一个组(group),然后将IP报文向这个组进行发送,也就相当于同时向多个主机传输数据

1、查看jdkdoc文档
2、查看类图关系
  • 在这里插入图片描述
3、抽象方法
  • @Override void close() throws IOException;就是继承父接口的
  • MembershipKey join(InetAddress group, NetworkInterface interf)throws IOException;
    • 加入多播组,开始接受从给定源地址发送到组的数据报,返回组成员密钥
    • group 多播地址
    • interf 要加入组的网络接口
    • MembershipKey 一个表示互联网协议(IP)多播组成员的令牌
  • MembershipKey join(InetAddress group, NetworkInterface interf, InetAddress source)throws IOException;
    • 加入多播组,开始接受从给定源地址发送到组的数据报,返回组成员密钥
    • group 多播地址
    • interf 要加入组的网络接口
    • source 源地址
    • MembershipKey 一个表示互联网协议(IP)多播组成员的令牌

十一、InterruptibleChannel接口

主要作用是使通道能以异步的方式进行关闭和中断

1、查看jdkdoc文档
2、查看类图关系
  • 图中看不全的名称后面都是channel

  • 在这里插入图片描述

3、抽象方法
  • public void close() throws IOException;

镇楼:NIO核心接口的实现类

1、AbstractInterruptibleChannel

2、AbstractSelectableChannel

3、AsynchronousFileChannel

4、AsynchronousServerSocketChannel

5、AsynchronousSocketChannel

6、DatagramChannel

7、FileChannel

8、Pipe.SinkChannel

9、Pipe.SourceChannel

10、SelectableChannel

11、ServerSocketChannel

12、SocketChannel

有兴趣的可以去都看一下,后面个人主要是对FileChannel写一个阅读笔记

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值