nio歸根結底就是使用通道的快取與對映,以實現輸入源與輸出源的操作簡化。
此篇不涉及web端的nio開發(選擇器/就緒載入/管道)
要想理解nio的快取機制,就必須要了解三個引數:
引數含義
capacity
緩衝區陣列的總長度
position
下乙個要操作的資料元素的位置
limit
而通道本身是用以下方法操作引數的:
方法名(buffer)
含義bytebuffer.allocate(1024)
生成/分配buffer的空間大小
hasremaining()
檢查當前位置與限制之間是否有元素
filp()
讀取與寫入轉換/其實就是限制長度和將position設定為0
clear()
重置快取區/歸根結底就是重置上面的三個引數(和硬碟快速格式化原理差不多)
compact()
清除已讀資料,將未讀資料提前,新寫入的資料將放在未讀資料後面
get()
從buffer中獲取一定長度的陣列
put()
往buffer中新增一定長度的陣列
方法名(channel)
含義read(buffer)
將資料讀到buffer中
write(buffer)
將buffer的資料寫入channel中
transferfrom(inputchannel,起始位置,長度)
將資料讀取到inputchannel中
transferto(起始位置,長度,outputchannel)
將資料寫入outputchannel中
map(mapmode,起始位置,長度)
將這段資料對映到記憶體中
附加功能
mapmode類
含義read_only
唯讀方式開啟
read_weite
讀寫模式,修改將直接對映到原始檔
private
專有模式,修改不會對映到原始檔
方法名(channel)
含義lock()
檔案鎖,顧名思義
字元轉換
charset cs = charset.
forname
("utf-8");
//轉為utf-8格式
charbuffer charbuffer = cs.
decode
(buffer)
;//先解析為char
return cs.
encode
(charbuffer)
;//再編碼為位元組
附上檔案複製**
/** 普通快取拷貝 */
public
static
void
copynio
(file file, file tofile)
throws ioexception
long stop = system.
currenttimemillis()
; system.out.
println
("nio:"
+(stop-start));
}catch
(exception e)
finally
}/** 記憶體對映拷貝 */
public
static
void
(file file, file tofile)
throws ioexception, fileexception
rb = inchannel.
map(mapmode.read_only, inchannel.
position()
, size)
;//對映檔案快取
outchannel.
write
(rb)
;//直接寫入
inchannel.
position
(inchannel.
position()
+ size)
;//設定inchannel的position
}// rb = inchannel.map(filechannel.mapmode.read_only, 0, inchannel.size());
// outchannel.write(rb);
long stop = system.
currenttimemillis()
; system.out.
println(+
(stop-start));
}catch
(exception e)
finally
}
得出的結果是記憶體對映幹不過快取。。無論記憶體對映容量調節到多少,都幹不過快取,我懷疑我遇到了乙個假的記憶體對映。。記憶體對映應該有更廣的用途,複製檔案什麼的,快取就足夠了
**案例裡面沒有涉及到get()/put()和transferfrom()/transferto(),僅僅是檔案複製的話不需要提高資料獲取的精度,如果之後需要獲取網路頭資訊啥的就會涉及。
實驗環境:jdk1.8
後續更新。。。
NIO 記憶體對映檔案 BufferedReader
其中一種通過把乙個套接字通道 socketchannel 註冊到乙個選擇器 selector 中,不時呼叫後者的選擇 select 方法就能返回滿足的選擇鍵 selectionkey 鍵中包含了socket事件資訊。這就是select模型。force 緩衝區是read write模式下,此方法對緩衝...
NIO 入門例項
1.2.4 入門示例 1.2.4.1 服務端 流程 建立serversocketchannel 非阻塞 繫結埠 serversocketchannel serversocketchannel serversocketchannel.open serversocketchannel.configure...
Scala入門 對映
map可以稱之為對映。它是由鍵值對組成的集合。在scala中,map也分為不可變map和可變map。語法 val var map map 鍵 值,鍵 值,鍵 值.推薦,可讀性更好 val var map map 鍵,值 鍵,值 鍵,值 鍵,值 定義乙個對映,包含以下學生姓名和年齡資料 zhangsa...