bytebuffer長度 ByteBuffer詳解

2021-10-16 01:16:08 字數 2289 閱讀 5916

本文首先講解bytebuffer的實現原理,然後會介紹bytebuffer中常用的api,以及其在使用過程中需要注意的點。

對於bytebuffer,其主要有五個屬性:mark,position,limit,capacity和array。這五個屬性的作用如下:

這幾個資料中,除了array是用於儲存資料的以外,這裡最終的主要是position,limit和capacity三個屬性,因為對於寫入和讀取模式,這三個屬性的表示的含義大不一樣。

如下圖所示為初始狀態和寫入3個位元組之後position,limit和capacity三個屬性的狀態:

從圖中可以看出,在寫入模式下,limit指向的始終是當前可最多寫入的陣列索引下標,position指向的則是下乙個可以寫入的資料的索引位置,而capacity則始終不會變化,即為陣列大小。

假設我們按照上述方式在初始長度為6的bytebuffer中寫入了三個位元組的資料,此時我們將模式切換為讀取模式,那麼這裡的position,limit和capacity則變為如下形式:

可以看到,當切換為讀取模式之後,limit則指向了最後乙個可讀取資料的下乙個位置,表示最多可讀取的資料;position則指向了陣列的初始位置,表示下乙個可讀取的資料的位置;capacity還是表示陣列的最大容量。這裡當我們乙個乙個讀取資料的時候,position就會依次往下切換,當期與limit重合時,就表示當前bytebuffer中已沒有可讀取的資料了。

對於bytebuffer的基本使用方式,從上面的演示中就可以看出,其主要有初始化,寫入,切換和讀取幾個基本操作。如下是bytebuffer的乙個基本使用示例:

@test

public void testbuffer()

private void print(bytebuffer buffer) }

在上面的示例中,我們首先建立乙個最大容量為6的bytebuffer,此時position為0,即初始狀態,而limit為6,與最大容量一致。當我們往buffer中寫入三個位元組資料之後,此時的position為3,limit還是6,表示還可以繼續往buffer中寫入三個資料。當我們切換為讀取模式之後,需要注意,此時buffer中寫入了三個位元組的資料,也就是說只有三個位元組的資料可供讀取,因而切換為讀取模式之後,position指向了0,表示下乙個可供讀取的資料位置,而limit為3,即為之前寫入的資料數量,而capacity始終為6,表示buffer的最大大小。

在前面我們講過,bytebuffer中海油乙個mark屬性,這個屬性是乙個標識的作用,即記錄當前position的位置,在後續如果呼叫reset()或者flip()方法時,bytebuffer的position就會被重置到mark所記錄的位置。因而對於寫入模式,在mark()並reset()後,將會回到mark記錄的可以寫入資料的位置;對於讀取模式,在mark()並reset()後,將會回到mark記錄的可以讀取的資料的位置。如下是mark()方法分別演示寫入和讀取資料的示例:

@test

public void testmark() }

對於rewind()方法,它的主要作用在於將當前的position重置為0,並且mark重置為-1,而且無論mark是否進行過標記。很明顯,rewind()和reset()方法都是進行重置的,但是reset()方法則是會優先重置到mark標記的位置。同理,對於寫入模式,rewind()方法會重置為初始寫入狀態,對於讀取模式,rewind()則會重置為初始讀取模式,其不會對limit屬性有任何影響。如下是rewind()方法的乙個使用示例:

@test

public void testrewind() }

對於compact()方法,其主要作用在於在讀取模式下進行資料壓縮,並且方便下一步繼續寫入資料。比如在乙個長度為6的bytebuffer中寫滿了資料,然後在讀取模式下讀取了三個資料之後,我們想繼續往buffer中寫入資料,此時由於只有前三個位元組是可用的,而後三個位元組是有效的資料,此時如果寫入的話是會把後面三個有效位元組給覆蓋掉的。因而需要將後面三個有效位元組往前移動,以空出三個位元組,並且將position指向下乙個可供寫入的位置,而不是遷移之後的索引0處。compact()方法的作用即在於此,如下是該方法的乙個使用示例:

@test

public void testcompact() }

本文首先展示了bytebuffer在寫入模式和讀取模式下內部的乙個狀態,然後簡單講解了bytebuffer的使用方式,並且展示了bytebuffer各個常用api的作用和用法。

ByteBuffer中實現方式

一 理解類中的mark position limit capacity關係 mark position limit capacity bytebuffer buffer bytebuffer.allocate 10 mark 1,position 0,limit capactiy 10 不管是讀取 ...

ByteBuffer類方法整理

static bytebuffer allocate int capacity 分配乙個新的位元組緩衝區。static bytebuffer allocatedirect int capacity 分配新的直接位元組緩衝區。static bytebuffer wrap byte array 將 by...

ByteBuffer 緩衝器(一)

public static void main final string args bytebuffer bytebuffer bytebuffer.allocate 10 system.out.println 初始位置 bytebuffer.position system.out.println ...