程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> JAVA綜合教程 >> JAVA NIO Channel,javaniochannel

JAVA NIO Channel,javaniochannel

編輯:JAVA綜合教程

JAVA NIO Channel,javaniochannel


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。異步關閉。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved