學(xué)習(xí)筆記——NIO(2)關(guān)于Buffer

Buffer是緩存逊彭,Buffer的作用是和NIO通道(Channel)進(jìn)行交互。
查閱資料知道:

緩沖區(qū)本質(zhì)上是一塊可以寫入數(shù)據(jù)构订,然后可以從中讀取數(shù)據(jù)的內(nèi)存侮叮。這塊內(nèi)存被包裝成NIO Buffer對(duì)象,并提供了一組方法悼瘾,用來方便的訪問該塊內(nèi)存囊榜。

Buffer的使用

總共分為四步:
1.寫數(shù)據(jù)到Buffer
2.調(diào)用flip()方法
3.從Buffer中讀取數(shù)據(jù)
4.調(diào)用clear()方法或者compact()方法
上一篇文章寫Channel測試的時(shí)候也簡單使用了Buffer。這里說一下clear()和compact()方法亥宿。他們都可以在讀取完畢之后清空緩存區(qū)卸勺,為以后的數(shù)據(jù)寫入做準(zhǔn)備,他們的區(qū)別在于:clear()方法會(huì)清空整個(gè)緩沖區(qū)烫扼。compact()方法只會(huì)清除已經(jīng)讀過的數(shù)據(jù)曙求。未讀過的數(shù)據(jù)會(huì)留在緩存區(qū)中,隨著后面讀入的數(shù)據(jù)一起等下一次的filp()材蛛。

這里用代碼簡單的使用一下:

public class TestBuffer {
    public static void main(String[] args) throws IOException {
        Charset charset = Charset.forName("utf-8");
        CharsetDecoder decoder = charset.newDecoder();
        RandomAccessFile file = new RandomAccessFile("nio-data.txt","rw");
        FileChannel channel = file.getChannel();
        ByteBuffer buf = ByteBuffer.allocate(48);
        CharBuffer cb = CharBuffer.allocate(48);
        int count = channel.read(buf);
        while (count!=-1){
            buf.flip();
            decoder.decode(buf,cb,false);
            cb.flip();
            while (cb.hasRemaining()){
                System.out.print(cb.get());
            }
            buf.compact();
            cb.compact();
            count = channel.read(buf);
        }
        file.close();
    }
}

這里我開始使用compact()而不是clear()了圆到。

接下來學(xué)習(xí)一下Buffer的原理

它有三個(gè)重要的屬性:

  • capacity(容量)
  • position(位置)
  • limit(界限)

position和limit的含義取決于Buffer處在讀模式還是寫模式怎抛。
capacity不然卑吭。

capacity(容量)

翻譯來是容量,很好理解马绝,既然是容量就又固定的大小豆赏,一旦Buffer滿了,我們就需要對(duì)其清空,然后才能繼續(xù)使用它掷邦。

position(位置)

寫模式:position表示數(shù)據(jù)當(dāng)前的位置白胀,會(huì)隨著數(shù)據(jù)的寫入不斷的移動(dòng),直到達(dá)到容量抚岗,position最大為capacity-1或杠。
讀模式:當(dāng)我們讀取數(shù)據(jù)時(shí),Buffer會(huì)從寫模式切換到讀模式宣蔚,然后position會(huì)清0向抢,position會(huì)移動(dòng)到可讀的位置。

limit(界限)

寫模式:limit表示我們還能向Buffer中寫多少數(shù)據(jù)胚委,此模式下limit等于capacity挟鸠。
讀模式:此模式下,limit表示我們可以從Buffer度多少數(shù)據(jù)亩冬,此時(shí)limit會(huì)設(shè)置為寫模式下的position值艘希。

其實(shí)有數(shù)據(jù)結(jié)構(gòu)的線性結(jié)構(gòu)的思想,理解起來就會(huì)很簡單硅急,可以通過復(fù)習(xí)數(shù)組覆享、鏈表、隊(duì)列和棧來回憶~

Buffer使用(細(xì)化)

為Buffer分配空間

前面練習(xí)有對(duì)Buffer分配空間的代碼营袜,這里提取出來單獨(dú)記:

ByteBuffer buf = ByteBuffer.allocate(48);

這就分配好了淹真,這里只是Byte類型,我們還可以使用很多基本類型的buffer连茧,就是可以通過char核蘸,short,int啸驯,long客扎,float 或 double類型來操作緩沖區(qū)中的字節(jié)。

向Buffer寫數(shù)據(jù)

我們可以選擇兩種方式去寫數(shù)據(jù):
1.用Channel向Buffer寫

int bytesRead = inChannel.read(buf); //read into buffer.

2.用Buffer自帶的put()方法

buf.put(127);

從Buffer讀數(shù)據(jù)

這之前先說個(gè)filp()方法罚斗,filp()這個(gè)辦法徙鱼,會(huì)將Buffer從寫模式切換成讀模式,將position設(shè)置為0针姿,并將limit設(shè)置成之前position的值袱吆,也就是說:position現(xiàn)在用于標(biāo)記讀的位置,limit表示之前寫進(jìn)了多少個(gè)byte距淫、char等 —— 現(xiàn)在能讀取多少個(gè)byte绞绒、char等。
讀數(shù)據(jù)也有兩種方式:
1.從Channel里讀

int bytesWritten = inChannel.write(buf);

2.用Buffer的get()方法

byte aByte = buf.get();
記一下rewind()方法

Buffer.rewind()會(huì)將position設(shè)回0榕暇,所以使用后蓬衡,我們可以重讀Buffer中的所有數(shù)據(jù)喻杈。

記一下clear()與compact()方法

前面有簡單的記過,這里具體說一說狰晚,當(dāng)我們讀完buffer中的數(shù)據(jù)之后筒饰,要將緩存清空,這時(shí)候就需要使用到這倆方法壁晒,可以根據(jù)實(shí)際情況任選其一~
clear()是清除所有的緩存瓷们。
compact()是清除已經(jīng)讀過的緩存。
clear()會(huì)把position設(shè)回0秒咐,limit被設(shè)置成 capacity的值换棚。
compact()將position設(shè)到最后一個(gè)未讀元素正后面。limit屬性依然像clear()方法一樣反镇,設(shè)置成capacity固蚤。

記一下mark()與reset()方法
buffer.mark();
buffer.reset();

通過調(diào)用Buffer.mark()方法,可以標(biāo)記Buffer中的一個(gè)特定position歹茶。之后可以通過調(diào)用Buffer.reset()方法恢復(fù)到這個(gè)position夕玩。

equals()與compareTo()方法

先說equals()
Q:什么情況下equals()返回true呢?
A:需要滿足以下情況:
1.類型相同
2.Buffer中剩余的byte惊豺、char等的個(gè)數(shù)相同
3.Buffer中所有剩余的byte燎孟、char等都相同。
所以Buffer中尸昧,equals()揩页,比較的是Buffer的剩余部分

Q:compareTo()方法是啥?
A:compareTo是比較兩個(gè)Buffer的剩余元素的(byte烹俗、char等)
什么情況下一個(gè)Buffer小于另一個(gè)Buffer呢爆侣?
1.第一個(gè)不相等的元素小于另一個(gè)Buffer中對(duì)應(yīng)的元素 。
2.所有元素都相等幢妄,但第一個(gè)Buffer比另一個(gè)先耗盡(第一個(gè)Buffer的元素個(gè)數(shù)比另一個(gè)少)兔仰。


Scatter和Gather

這里yi

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市蕉鸳,隨后出現(xiàn)的幾起案子乎赴,更是在濱河造成了極大的恐慌,老刑警劉巖潮尝,帶你破解...
    沈念sama閱讀 218,682評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件榕吼,死亡現(xiàn)場離奇詭異,居然都是意外死亡勉失,警方通過查閱死者的電腦和手機(jī)羹蚣,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,277評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來戴质,“玉大人度宦,你說我怎么就攤上這事踢匣「娼常” “怎么了戈抄?”我有些...
    開封第一講書人閱讀 165,083評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長后专。 經(jīng)常有香客問我划鸽,道長,這世上最難降的妖魔是什么戚哎? 我笑而不...
    開封第一講書人閱讀 58,763評(píng)論 1 295
  • 正文 為了忘掉前任裸诽,我火速辦了婚禮,結(jié)果婚禮上型凳,老公的妹妹穿的比我還像新娘丈冬。我一直安慰自己,他們只是感情好甘畅,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,785評(píng)論 6 392
  • 文/花漫 我一把揭開白布埂蕊。 她就那樣靜靜地躺著,像睡著了一般疏唾。 火紅的嫁衣襯著肌膚如雪蓄氧。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,624評(píng)論 1 305
  • 那天槐脏,我揣著相機(jī)與錄音喉童,去河邊找鬼。 笑死顿天,一個(gè)胖子當(dāng)著我的面吹牛堂氯,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播牌废,決...
    沈念sama閱讀 40,358評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼祖灰,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了畔规?” 一聲冷哼從身側(cè)響起局扶,我...
    開封第一講書人閱讀 39,261評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎叁扫,沒想到半個(gè)月后三妈,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,722評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡莫绣,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年畴蒲,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片对室。...
    茶點(diǎn)故事閱讀 40,030評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡模燥,死狀恐怖咖祭,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情蔫骂,我是刑警寧澤么翰,帶...
    沈念sama閱讀 35,737評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站辽旋,受9級(jí)特大地震影響浩嫌,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜补胚,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,360評(píng)論 3 330
  • 文/蒙蒙 一码耐、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧溶其,春花似錦骚腥、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,941評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至金闽,卻和暖如春纯露,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背代芜。 一陣腳步聲響...
    開封第一講書人閱讀 33,057評(píng)論 1 270
  • 我被黑心中介騙來泰國打工埠褪, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人挤庇。 一個(gè)月前我還...
    沈念sama閱讀 48,237評(píng)論 3 371
  • 正文 我出身青樓钞速,卻偏偏與公主長得像,于是被迫代替她去往敵國和親嫡秕。 傳聞我的和親對(duì)象是個(gè)殘疾皇子渴语,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,976評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • Java NIO(New IO)是從Java 1.4版本開始引入的一個(gè)新的IO API,可以替代標(biāo)準(zhǔn)的Java I...
    JackChen1024閱讀 7,555評(píng)論 1 143
  • Java NIO中的Buffer用于和NIO通道進(jìn)行交互昆咽。如你所知驾凶,數(shù)據(jù)是從通道讀入緩沖區(qū),從緩沖區(qū)寫入到通道中的...
    AFinalStone閱讀 277評(píng)論 0 0
  • 參考:http://ifeve.com/buffers/原文地址 目錄 Java NIO教程 Java NIO 教...
    步積閱讀 5,021評(píng)論 8 16
  • Java NIO中的Buffer用于和NIO通道進(jìn)行交互掷酗。如你所知调违,數(shù)據(jù)是從通道讀入緩沖區(qū),從緩沖區(qū)寫入到通道中的...
    bboymonk閱讀 519評(píng)論 0 0
  • 馮德倫:我們只是普通朋友 比起上次寶寶離婚在周日凌晨發(fā)公告泻轰,這次舒淇馮德倫的結(jié)婚消息選在周末公布也讓不少寫手被迫加...
    丁小米米米閱讀 1,225評(píng)論 4 26