java IO相關API探索之Buffer類

2021-06-27 11:02:40 字數 2940 閱讀 7813

filechannel類中直接通訊的就是buffer,buffer是通道和檔案之間的橋梁.大概資料互動是這樣的,filechannel可以寫資料到buffer中,同時另外乙個輸出filechannel也可以從buffer中讀取資料。

buffer中有兩種模式:讀模式和寫模式,讀模式會從position位置開始讀取到limit位元組;寫模式同樣也會從position寫到limit,但是寫模式中一般limit=capacity(buffer的大小)

buffer 中有四個變數來標示一些位置:

// invariants: mark <= position <= limit <= capacity

private

intmark = -1;

private

intposition = 0;

privateint

limit

;privateint

capacity

;這裡面有乙個恆不等式,就是上面指出的:mark<=position<=limit<=capacity

// used only by direct buffers

// note: hoisted here for speed in jni getdirectbufferaddress

long

address;

有乙個儲存關於位址的變數.看解釋好像是為了提高jni的速度。

下面是buffer得建構函式,宣告為default型別的,只在包裡面可見

buffer(int

mark, int

pos, int

lim, int

cap) }

下面是不允許重寫的capacity()和position()方法:

public

final

int capacity()

public

final

int position()

設定position的值,以便能夠滿足重複讀取通道中已經讀過的內容需求,如果設定position時,使得mark的值》position,那麼mark的值將會置為-1;下面是這個方法的實現:

public

final buffer position(int

newposition)

設定limit的值,如果limit>capacity那麼丟擲不合法引數異常,否則設定limit = newlimit,如果當前buffer的position的值大於limit,那麼設定position=limit,要不然在寫資料的時候從position讀到limit會永遠都寫不進去了,可能會出現資料不一致或者讀寫資料出錯的情況,這點要注意;

public

final buffer limit(int

newlimit)

如果buffer呼叫了mark()方法,那麼會使得mark的值等於position,每次讀資料或者寫資料的時候position會遞增,設定,呼叫mark方法,應該可以從下次再重複讀取內容了。但是在buffer中沒有找到reset方法,所以目前這個作用也只是個猜測(臥槽,這不坑爹麼.剛才猜測的時候全域性搜尋reset根本找不到.竟然在mark方法的下乙個方法就是reset,這就顯而易見了,position都回到了mark地方了,肯定就可以重複讀取了.)

public

final buffer reset()

呼叫clear方法會使得資料全部回歸原來的狀態,這樣在寫入buffer的時候,就又可以從position=0開始寫入了,如果position = limit的話,就沒有辦法寫入到buffer中了。

public

final buffer clear()

但是buffer中的內容根本不會清除,如果在clear()之後又去讀裡面的內容很可能就會造成問題,剛才試了試,會造成死迴圈:**如下:

//讀資料到buffer中,比如position=0,limit=capacity=50,輸入通道中有15個位元組

while(channelin.read(buffer) != -1)

當然flip在上篇文章中就介紹過.不過好像沒有說道具體實現,現在看一下具體實現,其實就是上篇說到的怎麼切換到讀模式的

public

final buffer flip()

下面這個方法,設定position=0,使得資料能夠重寫寫入並且覆蓋原來的寫入,也可以使得讀取的時候從頭開始重複讀取。

public

final buffer rewind()

下面這個函式有兩層含義:乙個是當讀取的時候,表示還有多少位元組沒有讀過;寫模式的時候表示還剩餘多少空間可寫。

public

final

int remaining()

獲取buffer的可讀屬性,判斷是否為唯讀

publicabstractbooleanisreadonly();

設定當前位置之後的多少位:功能跟position(int n)一樣

final

int nextgetindex()

final

int nextgetindex(int

nb)

下面這兩個函式跟上面的完全一樣,就是邏輯上乙個是讀乙個是寫

final

int nextputindex()

final

int nextputindex(int

nb)

檢測從i開始的第nb個位置的資料是否合法

final

int checkindex(int

i, int

nb)

截斷緩衝區,並且呼叫這個方法後,這個緩衝區就會變的不可用

final

void truncate()

總得來說,buffer的這些方法都是圍繞了buffer得物件模型展開的,主要操作元素就是物件中的mark,position,limit以及capacity屬性。理解了這層含義,那麼對於buffer的操作便會順心應手。

Java IO流相關知識

一 io流的分類 reader inputstreamreader 節點流 bufferedreader 處理流 writer outputstreamwriter 節點流 bufferedwriter 處理流 printwriter inputstream fileinputstream 節點流 ...

java io 相關常用操作詳解

1.檔案和資料夾的建立 2.檔案的讀取 3.檔案的寫入 4.檔案的複製 字元流 位元組流 處理流 相關函式 boolean mkdir 建立此抽象路徑名指定的目錄 boolean mkdirs 建立此抽象路徑名指定的目錄,包括所有必需但不存在的父目錄。boolean delete 刪除此抽象路徑名表...

探索Elasticsearch集群API

elasticsearch提供了乙個非常全面和強大的rest api,您可以使用與您的集群進行互動。為數不多的可以用api的事情如下 1.可以使用 catapi檢視elasticsearch的健康狀況,但是啟動時不能以守護程序方式啟動。root server01 curl 127.0.0.1 920...