概述
詳細
一、前言
本例子用於系統學習nio, 在介紹nio知識點過程中中, 使用以下案例
1:傳統IO與NIO 代碼對比與分析
2:NIO操作原理(例子:火車、車軌與車廂的舉例)
3:使用NIO實現文件拷貝
4:使用NIO實現非阻塞是socket通訊
二、代碼結構圖
1、代碼導入
下載代碼導入sts編輯器,如果沒有sts也可以直接導入到eclipse或者idea
2、代碼結構圖
三、項目運行
代碼使用的junit4單元測試, 只需要代碼每一個測試類, 選中要執行的方法右鍵運行:run as JunitTest即可。
安裝學習步驟:
1>打開BufferTest類, 先執行test1方法
目的:學習nio的核心之一Buffer模塊的常見api
運行效果:
2>打開ChannelTest類, 按照順序, 先后運行test1, test2, test3, test4, test5方法
目的:學習nio核心之一Channel 的獲取方式, 操作方式, 案例是文件拷貝
1:先准備一個a.avi文件
2:右鍵運行
3:運行結果, 多了b.avi文件, 拷貝成功
3>SelectorTest 跟 PipeTest 同理, 具體實現功能在注釋已經解釋。
四、項目相關資料
圖片:
思維導圖:
五、核心知識點解釋
傳統IO: 就是jdk純原生的IO操作
NIO: jdk1.4 之后提供的新的io操作, 可以異步讀取數據, 可以雙向讀取流
緩存區:nio 核心之一, nio操作的數據暫存在緩存區中,具體操作參考:BufferTest 類
通道:nio核心之一, nio通過緩存區操作數據, 而數據的讀與寫的流轉需要借助通道實現。 具體操作參考:ChannelTest
選擇器:nio核心之一, nio為解決非阻塞讀寫問題,而提出通過事件響應方式實現io操作, 選擇器是其中核心組件。具體操作參考:SelectorTest類
網絡IO:就是socket操作, 具體操作參考:SelectorTest類
六、部分源碼
/** * 一:緩沖區:負責數據的存取,緩沖區本質是一個數組,用於存儲不同類型的數據 * 根據數據類型不同(boolean除外),通過了7個緩沖區: * ByteBuffer * CharBuffer * ShortBuffer * IntBuffer * LongBuffer * FloatBuffer * DoubleBuffer * * 二:緩沖區存儲數據2種核心方法 * put(): 存入數據到緩沖區中 * get(): 獲取緩沖區中的數據 * * * * 三:緩沖區中四大核心屬性 * capacity:容量,表示緩沖區中最大的存儲數據的容量,一旦聲明不能改變 * limit:界限,表示緩沖區中可以操作數據的大小.(limit后面數據無法進行讀寫) * position:位置,表示緩沖區中正在操作數據的位置 * mark:標記,表示標記當前position的位置,可以通過reset() 回復到mark的位置 * * 約束: * position <= limit <= capacity * * */ public class BufferTest { @Test public void test2() throws Exception { //1:分配空間 ByteBuffer buffer = ByteBuffer.allocateDirect(1024); //2:判斷是否是直接緩沖區 buffer.isDirect(); } @Test public void test1() throws Exception { String str = "dafei"; //1:分配一個指定大小的緩沖區 ByteBuffer buf = ByteBuffer.allocateDirect(1024); System.out.println("-----------allocate----------------"); System.out.println(buf.capacity()); System.out.println(buf.limit()); System.out.println(buf.position()); //2:往緩沖區中存儲數據 buf.put(str.getBytes()); System.out.println("----------put----------------"); System.out.println(buf.capacity()); System.out.println(buf.limit()); System.out.println(buf.position()); //3:切換讀模式 buf.flip(); System.out.println("----------flip----------------"); System.out.println(buf.capacity()); System.out.println(buf.limit()); System.out.println(buf.position()); //4:獲取緩沖區存放的數據 System.out.println(buf.get()); System.out.println(buf.get()); System.out.println("----------get----------------"); System.out.println(buf.capacity()); System.out.println(buf.limit()); System.out.println(buf.position()); System.out.println("----------get----------------"); buf.rewind(); buf.remaining(); System.out.println(buf.capacity()); System.out.println(buf.limit()); System.out.println(buf.position()); } }
注:本文著作權歸作者,由demo大師發表,拒絕轉載,轉載需要作者授權