深入理解NIO核心元件

2021-10-14 15:08:15 字數 2915 閱讀 7136

io :input/output 輸入/輸出

本地磁碟讀寫是io

網路使用tcp/udp協議傳輸,也是io

以網路傳輸為例:

客戶端向服務端傳送乙個http請求

服務端給客戶端開啟乙個執行緒,並且等待資料讀寫

此時客戶端因網路原因或其他因素不進行讀寫,那麼服務端執行緒將會持續等待。

請求數增多後執行緒數也增多,對伺服器記憶體消耗較大,容易記憶體溢位。

再以網路傳輸為例:

客戶端向服務端傳送乙個http請求

服務端會有乙個io執行緒對請求連線進行監聽

當客戶端讀取或寫入資料時,io執行緒 將讀寫操作分配給其他執行緒執行。

當服務端接收多個客戶端請求,並且客戶端沒有進行讀寫操作。此時io執行緒不會分配新執行緒給客戶端,只監聽事件。這個技術稱為多路復用

資料傳輸流程

檔案 =》 channel (雙向管道,可讀可寫) =》 buffer 緩衝區 =》應用api

buffer

在buffer內維護了乙個陣列,我們需要了解三個屬性

position:當前位置(讀寫位置)

capacity:buffer容量

limit:限制位,讀或寫資料不能超過該位置

mark:標記位

buffer 讀寫流程

put / get 方法 從前向後讀寫,同時移動position指標,直至小於limit ,超過limit即會丟擲異常。

注意每次讀寫後 position 都會在最後的位置,此時如果要再次讀寫,需要執行 flip() 或者 rewind() 方法來設定 position值等於0。

常用方法

flip()

寫入buffer後進行讀取,呼叫該方法

public

final buffer flip()

remaining()獲取當前buffer資料長度

public

final

intremaining()

hasremaining()判斷是否讀到了盡頭

public

final

boolean

hasremaining()

rewind()重置position和mark 便於重新寫入buffer

public

final buffer rewind()

rewind()channel

channel有三類:

filechannel:對檔案進行讀寫操作

datagramchannel:udp協議傳輸

serversocketchannel:tcp協議傳輸

// filechannel

public

class

filechanneltest

buffer.

clear()

; system.out.

println

(new

string

(bytes));

}// 寫入資料到檔案

long position = channel.

position()

; system.out.

println

("position: "

+ position)

; channel.

write

(bytebuffer.

wrap

("哈哈哈"

.getbytes()

));}

}

// udp協議資料傳輸

@test

public

void

test()

throws ioexception

}@test

public

void

test1()

throws ioexception

system.out.

println

("收到伺服器訊息:"

+new

string

(arr));

}

/**

tcp協議傳輸,bio模型,(此時未使用selector)

* 服務端接收訊息

** @throws ioexception

*/@test

public

void

testserver()

throws ioexception

}public

void

handle

(final socketchannel socketchannel)

system.out.

println

(new

string

(arr));

buffer.

rewind()

; socketchannel.

write

(buffer);}

catch

(exception e)

catch

(ioexception ex)}}

}}).

start()

;}

深入理解NIO三大核心

limit 指定剩餘資料容量 剩餘可儲存資料空間 capacity 可以儲存在緩衝區的最大資料容量 public class bufferplay output 呼叫buffer.get buffer 復位 buffer.clear output 呼叫buffer.clear buffer 關閉管道...

深入理解vue元件

當使用table select等標籤時,元件標籤化可能會有bug,此時應該使用 is 接受元件。在子元件定義data時,data必須是乙個函式,不能是乙個物件。在vue中如果要操作dom,需要使用 ref 引用,從而獲取dom節點。需求 定義乙個子元件,使其數字自加,在父元件中對子元件的數字求和。單...

深入理解php核心

第二章 使用者 的執行 第三節 zend引擎與指令碼執行 第四節 小結 第三章 變數及資料型別 第二節 常量 第三節 預定義變數 第四節 靜態變數 第五節 型別提示的實現 第六節 變數的生命週期 第七節 資料型別轉換 第八節 小結 第四章 函式的實現 第二節 函式的定義,引數及返回值 第三節 函式的...