日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

ByteBuffer 类

發(fā)布時(shí)間:2024/1/23 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ByteBuffer 类 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
Buffer 類

定義了一個(gè)可以線性存放primitive type數(shù)據(jù)的容器接口。Buffer主要包含了與類型(byte, char…)無關(guān)的功能。
值得注意的是Buffer及其子類都不是線程安全的。

每個(gè)Buffer都有以下的屬性:

capacity
這個(gè)Buffer最多能放多少數(shù)據(jù)。capacity一般在buffer被創(chuàng)建的時(shí)候指定。

limit
在Buffer上進(jìn)行的讀寫操作都不能越過這個(gè)下標(biāo)。當(dāng)寫數(shù)據(jù)到buffer中時(shí),limit一般和capacity相等,當(dāng)讀數(shù)據(jù)時(shí),
limit代表buffer中有效數(shù)據(jù)的長度。

position
讀/寫操作的當(dāng)前下標(biāo)。當(dāng)使用buffer的相對位置進(jìn)行讀/寫操作時(shí),讀/寫會從這個(gè)下標(biāo)進(jìn)行,并在操作完成后
buffer會更新下標(biāo)的值。

mark
一個(gè)臨時(shí)存放的位置下標(biāo)。調(diào)用mark()會將mark設(shè)為當(dāng)前的position的值,以后調(diào)用reset()會將position屬性設(shè)
置為mark的值。mark的值總是小于等于position的值,如果將position的值設(shè)的比mark小,當(dāng)前的
mark值會被拋棄掉。

這些屬性總是滿足以下條件:
0 <= mark <= position <= limit <= capacity

limit和position的值除了通過limit()和position()函數(shù)來設(shè)置,也可以通過下面這些函數(shù)來改變:

Buffer clear()
把position設(shè)為0,把limit設(shè)為capacity,一般在把數(shù)據(jù)寫入Buffer前調(diào)用。

Buffer flip()
把limit設(shè)為當(dāng)前position,把position設(shè)為0,一般在從Buffer讀出數(shù)據(jù)前調(diào)用。

Buffer rewind()
把position設(shè)為0,limit不變,一般在把數(shù)據(jù)重寫入Buffer前調(diào)用。

Buffer對象有可能是只讀的,這時(shí),任何對該對象的寫操作都會觸發(fā)一個(gè)ReadOnlyBufferException。
isR
eadOnly()方法可以用來判斷一個(gè)Buffer是否只讀。


ByteBuffer 類

在Buffer的子類中,ByteBuffer是一個(gè)地位較為特殊的類,因?yàn)樵趈ava.io.channels中定義的各種channel的IO
操作基本上都是圍繞ByteBuffer展開的。

ByteBuffer定義了4個(gè)static方法來做創(chuàng)建工作:

ByteBuffer allocate(int capacity) //創(chuàng)建一個(gè)指定capacity的ByteBuffer。
ByteBuffer allocateDirect(int capacity) //創(chuàng)建一個(gè)direct的ByteBuffer,這樣的ByteBuffer在參與IO操作時(shí)性能會更好
ByteBuffer wrap(byte [] array)
ByteBuffer wrap(byte [] array, int offset, int length) //把一個(gè)byte數(shù)組或byte數(shù)組的一部分包裝成ByteBuffer。

ByteBuffer定義了一系列g(shù)et和put操作來從中讀寫byte數(shù)據(jù),如下面幾個(gè):
byte get()
ByteBuffer get(byte [] dst)
byte get(int index)
ByteBuffer put(byte b)
ByteBuffer put(byte [] src)
ByteBuffer put(int index, byte b)
這些操作可分為絕對定位和相對定為兩種,相對定位的讀寫操作依靠position來定位Buffer中的位置,并在操
作完成后會更新position的值。在其它類型的buffer中,也定義了相同的函數(shù)來讀寫數(shù)據(jù),唯一不同的就是一
些參數(shù)和返回值的類型。

除了讀寫byte類型數(shù)據(jù)的函數(shù),ByteBuffer的一個(gè)特別之處是它還定義了讀寫其它primitive數(shù)據(jù)的方法,如:

int getInt()?????? //從ByteBuffer中讀出一個(gè)int值。
ByteBuffer putInt(int value)???? // 寫入一個(gè)int值到ByteBuffer中。

讀寫其它類型的數(shù)據(jù)牽涉到字節(jié)序問題,ByteBuffer會按其字節(jié)序(大字節(jié)序或小字節(jié)序)寫入或讀出一個(gè)其

類型的數(shù)據(jù)(int,long…)。字節(jié)序可以用order方法來取得和設(shè)置:
ByteOrder order() //返回ByteBuffer的字節(jié)序。
ByteBuffer order(ByteOrder bo)?? // 設(shè)置ByteBuffer的字節(jié)序。

ByteBuffer另一個(gè)特別的地方是可以在它的基礎(chǔ)上得到其它類型的buffer。如:
CharBuffer asCharBuffer()
為當(dāng)前的ByteBuffer創(chuàng)建一個(gè)CharBuffer的視圖。在該視圖buffer中的讀寫操作會按照ByteBuffer的字節(jié)
序作用到ByteBuffer中的數(shù)據(jù)上。

用這類方法創(chuàng)建出來的buffer會從ByteBuffer的position位置開始到limit位置結(jié)束,可以看作是這段數(shù)據(jù)
的視圖。視圖buffer的readOnly屬性和direct屬性與ByteBuffer的一致,而且也只有通過這種方法,才可
以得到其他數(shù)據(jù)類型的direct buffer。

ByteOrder
用來表示ByteBuffer字節(jié)序的類,可將其看成java中的enum類型。主要定義了下面幾個(gè)static方法和屬性:
ByteOrder BIG_ENDIAN?????? 代表大字節(jié)序的ByteOrder。
ByteOrder LITTLE_ENDIAN?????? 代表小字節(jié)序的ByteOrder。
ByteOrder nativeOrder()?????? 返回當(dāng)前硬件平臺的字節(jié)序。

MappedByteBuffer
ByteBuffer的子類,是文件內(nèi)容在內(nèi)存中的映射。這個(gè)類的實(shí)例需要通過FileChannel的map()方法來創(chuàng)建。

接下來看看一個(gè)使用ByteBuffer的例子,這個(gè)例子從標(biāo)準(zhǔn)輸入不停地讀入字符,當(dāng)讀滿一行后,將收集的字符
寫到標(biāo)準(zhǔn)輸出:

public static void main(String [] args)throws IOException{// 創(chuàng)建一個(gè)capacity為256的ByteBufferByteBuffer buf = ByteBuffer.allocate(256);while (true) {// 從標(biāo)準(zhǔn)輸入流讀入一個(gè)字符int c = System.in.read();// 當(dāng)讀到輸入流結(jié)束時(shí),退出循環(huán)if (c == -1)break;// 把讀入的字符寫入ByteBuffer中buf.put((byte) c);// 當(dāng)讀完一行時(shí),輸出收集的字符if (c == '\n') {// 調(diào)用flip()使limit變?yōu)楫?dāng)前的position的值,position變?yōu)?,// 為接下來從ByteBuffer讀取做準(zhǔn)備buf.flip();// 構(gòu)建一個(gè)byte數(shù)組byte [] content = new byte[buf.limit()];// 從ByteBuffer中讀取數(shù)據(jù)到byte數(shù)組中buf.get(content);// 把byte數(shù)組的內(nèi)容寫到標(biāo)準(zhǔn)輸出System.out.print(new String(content));// 調(diào)用clear()使position變?yōu)?,limit變?yōu)閏apacity的值,// 為接下來寫入數(shù)據(jù)到ByteBuffer中做準(zhǔn)備buf.clear();}}}

總結(jié)

以上是生活随笔為你收集整理的ByteBuffer 类的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。