NIO 学习笔记
?
?
0. 介紹
參考? ?關(guān)于Java IO與NIO知識都在這里? ?,在其基礎(chǔ)上進(jìn)行修改與補(bǔ)充。
?
?
1. NIO介紹
1.1 NIO 是什么
Java NIO 是 java 1.4, 之后新出的一套IO接口.
NIO中的N可以理解為Non-blocking,不單純是New。
?
1.2 NIO的特性/NIO與IO區(qū)別
?
阻塞和非阻塞關(guān)注的是程序在等待調(diào)用結(jié)果(消息,返回值)時的狀態(tài).
阻塞調(diào)用:是指調(diào)用結(jié)果返回之前,當(dāng)前線程會被掛起。調(diào)用線程只有在得到結(jié)果之后才會返回。
非阻塞調(diào)用:指在不能立刻得到結(jié)果之前,該調(diào)用不會阻塞當(dāng)前線程。
1.3 讀數(shù)據(jù)和寫數(shù)據(jù)方式
1.4 NIO核心組件簡單介紹
?
?
2.?Buffer
2.1 Buffer(緩沖區(qū))介紹
2.2 Buffer 的屬性
capacity(容量):
緩沖區(qū)的 capacity 表明可以儲存在緩沖區(qū)中的最大數(shù)據(jù)容量。實(shí)際上,它指定了底層數(shù)組的大小 ,或者至少是指定了準(zhǔn)許我們使用的底層數(shù)組的容量。一旦Buffer寫滿了就需要清空已讀數(shù)據(jù)以便下次繼續(xù)寫入新的數(shù)據(jù)。
?
position(位置):
當(dāng)寫入數(shù)據(jù)到Buffer的時候需要選中一個確定的位置開始,默認(rèn)初始化時這個位置position為0,一旦寫入了數(shù)據(jù)比如一個字節(jié),整型數(shù)據(jù),那么position的值就會指向數(shù)據(jù)之后的一個單元,position最大可以到capacity-1。
當(dāng)從Buffer讀取數(shù)據(jù)時,也需要從一個確定的位置開始。Buffer從寫入模式變?yōu)樽x取模式時,position會歸零,每次讀取后,position向后移動。
?
limit(限制):
在寫模式,limit的含義是我們所能寫入的最大數(shù)據(jù)量。它等同于Buffer的容量。
一旦切換到讀模式,limit則代表我們所能讀取的最大數(shù)據(jù)量,他的值等同于寫模式下position的位置。
數(shù)據(jù)讀取的上限是Buffer中已有的數(shù)據(jù),也就是limit的位置(原position所指的位置)。
? 2.3 Buffer的常見方法
mark() :
記錄當(dāng)前標(biāo)記,以便后來可以定位到此處
0 <= mark <= position <= limit <= capacity
?
? reset():
將position定位到mark處
?
rewind()
取消mark標(biāo)記
?
flip():
flip()方法可以吧Buffer從寫模式切換到讀模式。調(diào)用flip()方法會把position歸零,并設(shè)置limit為之前的position的值。 也就是說,現(xiàn)在position代表的是讀取位置,limit標(biāo)示的是已寫入的數(shù)據(jù)位置。
?
clear() :
為寫數(shù)據(jù)做好準(zhǔn)備,相當(dāng)于緩沖區(qū)剛分配時的狀態(tài)
將limit設(shè)置為capacity的值
將position歸零
?
2.4 Buffer的使用方式/方法介紹
分配緩沖區(qū)(Allocating a Buffer):
ByteBuffer buf = ByteBuffer.allocate(10);
寫入數(shù)據(jù)到緩沖區(qū)(Writing Data to a Buffer):
方法一:從Channel中寫數(shù)據(jù)到Buffer
int bytesRead = inChannel.read(buf);?
方法二:通過put寫數(shù)據(jù)
buf.put(10);?
?
3. Channel
3.1 介紹
通常來說NIO中的所有IO都是從 Channel(通道) 開始的。
從通道進(jìn)行數(shù)據(jù)讀取 :創(chuàng)建一個緩沖區(qū),然后請求通道讀取數(shù)據(jù)。
從通道進(jìn)行數(shù)據(jù)寫入 :創(chuàng)建一個緩沖區(qū),填充數(shù)據(jù),并要求通道寫入數(shù)據(jù)。
數(shù)據(jù)讀取和寫入操作圖示:
3.2 channel與流的區(qū)別
?
3.3 Java NIO中最重要的幾個Channel的實(shí)現(xiàn)
待補(bǔ)充。。。
?
?
4. Selector
4.1 介紹
Selector 一般稱 為選擇器 ,它是Java NIO核心組件中的一個,用于檢查一個或多個NIO Channel(通道)的狀態(tài)是否處于可讀、可寫。如此可以實(shí)現(xiàn)單線程管理多個channels,也就是可以管理多個網(wǎng)絡(luò)鏈接。
使用Selector的好處在于: 使用更少的線程來就可以來處理通道了, 相比使用多個線程,避免了線程上下文切換帶來的開銷。
待補(bǔ)充。。。
?
?
?
轉(zhuǎn)載于:https://www.cnblogs.com/share23/p/9635001.html
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎總結(jié)
- 上一篇: Anaconda配置和使用
- 下一篇: samba登陆密码不正确