NIO
NIO概述
Java NIO 由以下核心部分組成:
- Channel通道
- Buffer緩沖區
- Selector選擇器
在Java NIO編程中,我們是面向緩沖區(Buffer)編程的,對緩沖區常常需要使用
java.nio.Buffer中的flip()方法
我們先來介紹一些什么是Buffer
Buffer
-
使用 Buffer 與 Channel 互動,資料從通道讀入緩沖區,或從緩沖區寫入通道,
-
緩沖區本質上是一個可以寫入資料的記憶體塊,之后可以讀取資料, Buffer 物件包裝了此記憶體塊,提供了一組方法,可以更輕松地使用記憶體塊,
Buffer通常的操作
-
將資料寫入緩沖區
-
呼叫 buffer.flip() 反轉讀寫模式
-
從緩沖區讀取資料
-
呼叫 buffer.clear() 或 buffer.compact() 清除緩沖區內容
Buffer的重要屬性
-
capacity : 容量緩沖區的容量,是它所包含的元素的數量,不能為負并且不能更改,
-
position :緩沖區的位置 是下一個要讀取或寫入的元素的索引,不能為負,并且不能大于 limit
-
limit : 緩沖區的限制,緩沖區的限制不能為負,并且不能大于 capacity

flip():Buffer有兩種模式,寫模式和讀模式,在寫模式下呼叫flip()之后,Buffer從寫模式變成讀模式,
那么limit就設定成了position當前的值(即當前寫了多少資料),postion會被置為0,以表示讀操作從快取的頭開始讀,mark置為-1,
呼叫flip()方法之前,往緩沖區寫資料

呼叫flip()方法后,從寫模式變成讀模式

讓我們一起看一段代碼:src/test/resources/index.html中的index.html的資料為abcdefg

首先,我們設定的緩沖區的大小為 4 個位元組的大小,當我們運行結果為:

在buffer.flip()方法執行之前,一直在寫資料,在buffer.flip()方法執行完之后,Buffer從寫模式變成讀模式,然后通過這句代碼System.out.println(decoder.decode(buffer));列印出了資料為:abcd
1.flip呼叫之前,一直往緩沖區寫資料,由于緩沖區的大小為4個位元組,所以只能寫abcd,也就是代碼中的結果
- S1 : Pos: 4 Limit:4

2.flip呼叫之后,轉換為讀模式,Position變為0,
- 運行結果S2 : Pos: 0 Limit:4

3.Decode呼叫后,列印出結果abcd
- S3 : Pos: 3 Limit:3

4.Clear 呼叫后
- Position回到0的位置,但是Buffer沒有被清空(可以理解為abcd還存在)

- 由于我們有7個資料,但是緩沖區的大小為4,所以我們需要執行兩遍代碼
5.第二次read后(由于Buffer沒有被清空,所以d還存在)
- S1 : Pos: 3 Limit:4

6. 第二次 flip呼叫之后
- S2 : Pos: 0 Limit:3

7. 第二次Decode呼叫后
- efg
- S3 : Pos: 3 Limit:3

abcdefg 這條資料就被讀取出來了,
如果代碼中buffer.flip()這個方法沒有執行,結果會出現什么,話不多說,直接看結果

原來列印abcd的地方變成了空,沒有任何結果列印,
整體程序就是:
- 寫資料

- 沒有呼叫flip,Position還在原來的位置,Decode呼叫后,所以為空,

- 第二次read后

- 第二次Decode呼叫后

所以列印d
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/188045.html
標籤:其他
上一篇:約瑟夫死亡游戲(回圈單鏈表)
