Java review--NIO
NIO其實很簡單,核心元件就三個:通道(Channels), 緩衝區(Buffers),Selectors(選擇器)。
Selector和Channel
要使用Selector,得向Selector檢測多個NIO通道,並註冊Channel,然後呼叫它的select()方法。這個方法會一直阻塞到某個註冊的通道有事件就緒。一旦這個方法返回,執行緒就可以處理這些事件,事件的例子有如新連線進來,資料接收等.
簡述實現就是:
1.建立
Selector selector = Selector.open();
2.註冊通道(FileChannel不可以,因為它只能是阻塞模式)
channel.configureBlocking(false);//channel處於非阻塞模式
SelectionKey key = channel.register(selector,Selectionkey.OP_READ);
3.可以監聽的事件
connect /accept/read/write
4.Selector註冊Channel時,register()方法會返回一個SelectionKey物件
selectionKey.isAcceptable();
selectionKey.isConnectable();
selectionKey.isReadable();
selectionKey.isWritable();
Buffers使用
1.Buffer寫入資料,記錄條數
2.讀取資料,通過flip()方法將Buffer()從寫模式,轉換到讀模式,可讀取所有資料。
3.讀取完成後,清空緩衝區,可複寫。
清空方式:clear()清空整個緩衝區 ;compact()清楚已經讀過的所有資料。
未讀的資料放到緩衝區起始位置,新寫入的資料將放到緩衝區未讀資料的後面。
IO和NIO對比
對比之前,先補充一些基礎知識,同步和非同步,阻塞和非阻塞。
1)阻塞、非阻塞
阻塞:一直等到資料準備好;
非阻塞:有就返回資料,沒有直接返回。
2)同步、非同步
同步IO:阻塞某方法,等待IO時間完成;直到讀寫進入執行緒,開銷較大。
非同步IO:把IO讀寫交給作業系統,完成後給應用程式一個通知。
IO | NIO |
面向流 | 面向緩衝區 |
阻塞、同步 | 非阻塞、非同步 |
無 | 選擇器Selector |
NIO比IO靈活,在資料讀取移動方面;並且Selector可以一個單獨的執行緒監視多個輸入通道。
參考系列部落格:http://ifeve.com/buffers/
相關文章
- Java review--NIO例項:實現服務端和客戶端的簡單通訊JavaView服務端客戶端
- 【JAVA】java使用Java
- JAVA(三)JAVA常用類庫/JAVA IOJava
- Java 解惑(Java Puzzler)Java
- Java打劫(The Java Heist)Java
- JAVA java學習(24)——————java修飾符Java
- Java 陣列、Java 日期時間、Java 正規表示式、Java 方法Java陣列
- Java 安全之Java AgentJava
- 淺析Java反射--JavaJava反射
- Java 8 + 10 = Java 18Java
- 【Java】A Guide to the Java ExecutorServiceJavaGUIIDE
- 【Java】The Java Headless ModeJava
- 【Java筆記】Java JDKJava筆記JDK
- JAVA面試題 java部分Java面試題
- java基礎-java NIOJava
- java之JAVA異常Java
- java日期 java陣列Java陣列
- Java from SUN & Son of JavaJava
- java Java與編碼Java
- Treasure Of JAVA——JAVA的資料型別(JAVA面試題)Java資料型別面試題
- Java筆記-Java反射(二)Java筆記反射
- Java基礎類庫【Java】Java
- Java學習—java-RedisJavaRedis
- Java:Java的物件導向Java物件
- java分散式(java入門)Java分散式
- Java基礎系列—Java反射Java反射
- 《Java專欄》— 初學JavaJava
- 【java基礎】--Java列舉Java
- JAVA面試題-CORE JAVA部分Java面試題
- java "|"Java
- JavaJava
- JAVA學習筆記—JAVA WEB(二)JAVA WEB核心(下)Java筆記Web
- [JAVA] Java switch的使用細節Java
- 【Java遊戲】java俄羅斯方塊!Java遊戲
- ?Java基礎之Java列舉Java
- 【java提高】(17)---Java 位運算子Java
- java 8 - java 17 升級指北Java
- 《Effective Java》--Java進階必備Java