IO通道


本文原創,轉載需標明原處。

 

通道,主要負責傳輸數據,相當於流,但流只能是輸入或輸出類型中的其一,而通道則可以兼並二者。

通道的基類是:Channel

  • boolean isOpen()
  • void close()

 

通道有同步方式和異步方式。

  • 同步方式:親力親為,不交給他人來做。
  • 異步方式:需要等待的事情,交給他人來做。做完之后,可以自己接着做,也可以由他人繼續接着做。

 

通道有阻塞方式與非阻塞方式。

  • 阻塞方式:在做這件事時,可能需要等待,也可能不需要等待。
  • 非阻塞方式:在做這件事之前,確保不需要等待。換句話說,確保不需要等待的時候,我才來做。例如,銀行人多的時候,我就直接離開,沒人的時候,我就進入。

 

同步方式的輸入輸出通道

 

上圖表示出,同步方式的輸入輸出通道的數據流通。這些通道的基類主要是ReadableByteChannelWritableByteChannel

  • ReadableByteChannelWritableByteChannel,操作一個ByteBuffer進行讀寫字節數據。
  • ScatteringByteChannelGatheringByteChannel分別是ReadableByteChannelWritableByteChannel強化版,不僅可以操作一個ByteBuffer,還可以操作一組ByteBuffer。
  • FileChannel提供了更為快捷的操作,直接操作ReadableByteChannelWritableByteChannel進行讀寫。
  • ByteChannel僅僅只是ReadableByteChannelWritableByteChannel的組合,因此自然也是那些同時繼承了ReadableByteChannelWritableByteChannel的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建立,其它方式的建立,如下圖:

 

 

待續更新……


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM