歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Java NIO操作類型

Java NIO操作類型

日期:2017/3/1 9:37:00   编辑:Linux編程

JAVA NIO共定義了四種操作類型:OP_READ、OP_WRITE、OP_CONNECT、OP_ACCEPT,分別對應讀、寫、請求連接、接受連接等網絡Socket操作。ServerSocketChannel和SocketChannel可以注冊自己感興趣的操作類型,當對應操作類型的就緒條件滿足時OS會通知channel,下表描述各種Channel允許注冊的操作類型,Y表示允許注冊,N表示不允許注冊,其中服務器SocketChannel指由服務器ServerSocketChannel.accept()返回的對象。

OP_READ OP_WRITE OP_CONNECT OP_ACCEPT 服務器ServerSocketChannel N N N Y 服務器SocketChannel Y Y N N 客戶端SocketChannel Y Y Y N

客戶端請求連接,服務器端接受連接,客戶端與服務器端開始相互發送消息(讀寫),按這個邏輯上表就容易理解。為了更深入理解,我們可以看看每個操作類型的就緒條件。

操作類型 就緒條件及說明 OP_READ 當操作系統讀緩沖區有數據可讀時就緒。並非時刻都有數據可讀,所以一般需要注冊該操作,僅當有就緒時才發起讀操作,有的放矢,避免浪費CPU。 OP_WRITE 當操作系統寫緩沖區有空閒空間時就緒。一般情況下寫緩沖區都有空閒空間,小塊數據直接寫入即可,沒必要注冊該操作類型,否則該條件不斷就緒浪費CPU;但如果是寫密集型的任務,比如文件下載等,緩沖區很可能滿,注冊該操作類型就很有必要,同時注意寫完後取消注冊。 OP_CONNECT 當SocketChannel.connect()請求連接成功後就緒。該操作只給客戶端使用。 OP_ACCEPT 當接收到一個客戶端連接請求時就緒。該操作只給服務器使用。

java.nio.channels.SelectionKey類定義了這四種操作類型並提供就緒判斷方法:

public final boolean isReadable() {
return (readyOps() & OP_READ) != 0;
}

public final boolean isWritable() {
return (readyOps() & OP_WRITE) != 0;
}

public final boolean isConnectable() {
return (readyOps() & OP_CONNECT) != 0;
}

public final boolean isAcceptable() {
return (readyOps() & OP_ACCEPT) != 0;
}

Java中介者設計模式 http://www.linuxidc.com/Linux/2014-07/104319.htm

Java 設計模式之模板方法開發中應用 http://www.linuxidc.com/Linux/2014-07/104318.htm

設計模式之 Java 中的單例模式(Singleton) http://www.linuxidc.com/Linux/2014-06/103542.htm

Java對象序列化 http://www.linuxidc.com/Linux/2014-10/107584.htm

大話設計模式(帶目錄完整版) PDF+源代碼 http://www.linuxidc.com/Linux/2014-08/105152.htm

Java中的函數傳遞 http://www.linuxidc.com/Linux/2014-11/109056.htm

Copyright © Linux教程網 All Rights Reserved