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寫一個閱讀筆記

發佈了48 篇原創文章 · 獲贊 17 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章