JAVA NIO Channel

Basic:
 
多數通道都是連接到開發的文件描述符的。Channel類提供維持平臺獨立性的抽象過程。
 
通道是一種途徑,訪問和操做操做系統,緩衝區是數據操做點:
Channel類繼承結構圖:
經過API主要由接口指定(面向接口),通道實現常常要操做本地操做系統的代碼,因此不一樣操做系統的實現會有根本的差別性,通道接口容許以可控且可抑制的方式來訪問底層IO.
 
IO廣義兩大類:File IO、Stream IO 《==》通道兩大類:FileChannel(文件通道)、SocketChannel-ServerSocketChannel-DatagramChannel(套接字通道)。
 
通道的單向和雙向:實現ReadableByteChannel read()方法《==》實現WritableByteChannel write()方法。
ByteChannle只是一個提供繼承便捷的藉口。簡化類定義的語法糖。全部通道基本都是雙向的。
 
通道會鏈接一個特定的IO服務,且通道實例性能受所鏈接的IO服務的特徵限制。
 
ByteChannel 的read()和write()方法是用ByteBuffer做爲參數,返回已傳輸的字節數,比緩衝區的字節數少或者可能爲0,由於一次輸出不完,緩衝去的位置會與已傳輸字節相同數量的前移,若是隻進行了部分傳輸,緩衝區能夠被從新提交給通道,並從上次中斷的地方繼續傳輸(基於Buffer的positon屬性,繼續操做postion到limit的數據)。該過程重複進行,直到Buffer.hasRemaining()方法返回false:以下:
 
 1 /**
 2      * 基於基本channel buffer的文件複製操做
 3      */
 4     public static void fileTransferByNormal() {
 5         try {
 6             RandomAccessFile afile = new RandomAccessFile("hello.txt", "rw");
 7             RandomAccessFile bfile = new RandomAccessFile("hehe.txt", "rw");
 8             FileChannel ac = afile.getChannel();
 9             FileChannel bc = bfile.getChannel();
10 
11             ByteBuffer bf = ByteBuffer.allocateDirect(16 * 1024);
12             while (ac.read(bf) != -1) {
13                 bf.flip();
14                 while (bf.hasRemaining()) {
15                     bc.write(bf);
16                 }
17                 bf.clear();
18             }
19         } catch (FileNotFoundException e) {
20             e.printStackTrace();
21         } catch (IOException e) {
22             e.printStackTrace();
23         }
24     }

 

Blocking Nonblocking:非阻塞模式不會讓調用的線程休眠,要麼請求當即完成,或者返回誤操做。Stream-oriented能夠設置nonblocking。
 
Socket Channel 繼承自SelectableChannel=》Selectors=》多路複用。(非阻塞IO)。
 
通道關閉:
通道不能被重複利用,打開的通道表明與一個特定IO服務的特定連接並封裝該連接的狀態,通道關閉則連接丟失。
 
通道上的屢次close(),無影響。
 
若是一個線程在一個通道上被阻塞同時被中斷,則該通道將被關閉,線程拋出ClosedByInterruptException異常。
 
一個線程的interrupt status被設置,且該線程視圖訪問一個通道,那麼這個通道會被關閉,並拋出ClosedByInterruptException異常。
 
通道上休眠線程的中斷區別於selectors上的休眠線程的中斷。
 
實現InterruptableChannel的Channel能夠在任什麼時候候被關閉,同時通道上的休眠線程會被喚醒並接收到一個AsynchronousInterruptedException。異步關閉。
相關文章
相關標籤/搜索