系統學習NIO


概述

適用於有一定編程基礎的朋友,想系統學習NIO這塊知識的朋友。知識點大體分3塊:1:>概念了解(各類IO) 2>NIO的核心(緩存區,通道等) 3>網絡IO

詳細

一、前言

本例子用於系統學習nio, 在介紹nio知識點過程中中, 使用以下案例

1:傳統IO與NIO 代碼對比與分析

image.png

2:NIO操作原理(例子:火車、車軌與車廂的舉例)

image.png

3:使用NIO實現文件拷貝

image.pngimage.png

4:使用NIO實現非阻塞是socket通訊

image.png

 

二、代碼結構圖

1、代碼導入

下載代碼導入sts編輯器,如果沒有sts也可以直接導入到eclipse或者idea

2、代碼結構圖

image.png

三、項目運行

代碼使用的junit4單元測試, 只需要代碼每一個測試類, 選中要執行的方法右鍵運行:run as JunitTest即可。

安裝學習步驟:

1>打開BufferTest類, 先執行test1方法

目的:學習nio的核心之一Buffer模塊的常見api

image.png

運行效果:

image.png

2>打開ChannelTest類, 按照順序, 先后運行test1, test2, test3, test4, test5方法

目的:學習nio核心之一Channel 的獲取方式, 操作方式, 案例是文件拷貝

1:先准備一個a.avi文件

image.png

2:右鍵運行

image.png

3:運行結果, 多了b.avi文件, 拷貝成功

image.png

3>SelectorTest 跟 PipeTest 同理, 具體實現功能在注釋已經解釋。

 

四、項目相關資料

圖片:

image.png

思維導圖:

11.png

五、核心知識點解釋

 

傳統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大師發表,拒絕轉載,轉載需要作者授權

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM