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文檔
-
java.nio.channels
-
All Superinterfaces:
-
All Known Subinterfaces:
-
All Known Implementing Classes:
AsynchronousFileChannel, AsynchronousServerSocketChannel, AsynchronousSocketChannel
-
2、查看類圖關係
-
3、抽象方法
void close() throws IOException;
二、AsynchronousByteChannel接口
主要作用是使通道支持異步I/O操作,操作單位爲字節
read和write方法在上一個未完成的時候再次調用會拋出異常,其他I/O操作是否可以同時進行read操作,取決於通道的類型或實現,ByteBuffer類不是線程安全的
1、查看jdkdoc文檔
-
java.nio.channels
-
All Superinterfaces:
-
All Known Implementing Classes:
-
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文檔
-
java.nio.channels
-
All Superinterfaces:
-
All Known Subinterfaces:
-
All Known Implementing Classes:
DatagramChannel, FileChannel, Pipe.SourceChannel, SocketChannel
-
2、查看類圖關係
3、抽象方法
public int read(ByteBuffer dst) throws IOException;
- 從通道中讀取數據到dst緩存區,只允許有1個讀操作在進行,如果1個線程正在1個通道上執行1個read()操作,那麼任何試圖發起另一個read()操作的線程都會被阻塞,直到第一個read()操作完成。其它類型的I/O操作是否可以與read()操作同時進行,取決於通道的類型。所以它是同步的。
四、ScatteringByteChannel接口
主要作用是可以從通道中讀取字節到多個緩衝區
1、查看jdkdoc文檔
-
java.nio.channels
-
All Superinterfaces:
-
All Known Implementing Classes:
DatagramChannel, FileChannel, Pipe.SourceChannel, SocketChannel
-
2、查看類圖關係
3、抽象方法
public long read(ByteBuffer[] dsts, int offset, int length)throws IOException;
public long read(ByteBuffer[] dsts) throws IOException;
五、WritableByteChannel接口
主要作用是使通道允許對字節進行寫操作
1、查看jdkdoc文檔
-
java.nio.channels
-
All Superinterfaces:
-
All Known Subinterfaces:
-
All Known Implementing Classes:
DatagramChannel, FileChannel, Pipe.SinkChannel, SocketChannel
-
2、查看類圖關係
3、抽象方法
public int write(ByteBuffer src) throws IOException;
- 將1個字節緩存區的字節序列寫入通道的當前位置;
- 方法是同步的
六、GatheringByteChannel接口
主要作用是可以將多個緩衝區中的數據寫入到通道中
1、查看jdkdoc文檔
-
java.nio.channels
-
All Superinterfaces:
-
All Known Implementing Classes:
DatagramChannel, FileChannel, Pipe.SinkChannel, SocketChannel
-
2、查看類圖關係
3、抽象方法
七、ByteChannel接口
主要作用是講ReadableByteChannel(可讀字節通道)和WritableByteChannel(可寫字節通道)的規範進行統一,也就是ByteChannel接口的父接口就是ReadableByteChannel和WritableByteChannel。
1、查看jdkdoc文檔
-
java.nio.channels
-
All Superinterfaces:
AutoCloseable, Channel, Closeable, ReadableByteChannel, WritableByteChannel
-
All Known Subinterfaces:
-
All Known Implementing Classes:
-
2、查看類圖關係
3、抽象方法
- 無,直接具有父類的read和write方法
八、SeekableByteChannel接口
主要作用是在字節通道中維護position(位置),以及允許position發生改變
1、查看jdkdoc文檔
-
java.nio.channels
-
All Superinterfaces:
AutoCloseable, ByteChannel, Channel, Closeable, ReadableByteChannel, WritableByteChannel
-
All Known Implementing Classes:
-
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文檔
-
java.nio.channels
-
All Superinterfaces:
-
All Known Subinterfaces:
-
All Known Implementing Classes:
AsynchronousServerSocketChannel, AsynchronousSocketChannel, DatagramChannel, ServerSocketChannel, SocketChannel
-
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文檔
-
java.nio.channels
-
All Superinterfaces:
-
All Known Implementing Classes:
-
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文檔
-
java.nio.channels
-
All Superinterfaces:
-
All Known Implementing Classes:
AbstractInterruptibleChannel, AbstractSelectableChannel, DatagramChannel, FileChannel, Pipe.SinkChannel, Pipe.SourceChannel, SelectableChannel, ServerSocketChannel, SocketChannel
-
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寫一個閱讀筆記