本文原創,轉載需標明原處。
通道,主要負責傳輸數據,相當於流,但流只能是輸入或輸出類型中的其一,而通道則可以兼並二者。
通道的基類是: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建立,其它方式的建立,如下圖:

待續更新……
