真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

JavaNIOBuffer過程詳解

前言

站在用戶的角度思考問題,與客戶深入溝通,找到印臺網(wǎng)站設(shè)計(jì)與印臺網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗(yàn),讓設(shè)計(jì)與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個性化、用戶體驗(yàn)好的作品,建站類型包括:做網(wǎng)站、成都網(wǎng)站建設(shè)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣、域名注冊、網(wǎng)站空間、企業(yè)郵箱。業(yè)務(wù)覆蓋印臺地區(qū)。

在與NIO通道交互時使用Java NIO Buffer。 如您所知,數(shù)據(jù)從通道讀入緩沖區(qū),并從緩沖區(qū)寫入通道。

緩沖區(qū)本質(zhì)上是一個可以寫入數(shù)據(jù)的內(nèi)存塊,然后可以再次讀取。 此內(nèi)存塊包含在NIO Buffer對象中,該對象提供了一組方法,可以更輕松地使用內(nèi)存塊。

基本緩沖區(qū)用法

使用緩沖區(qū)讀取和寫入數(shù)據(jù)通常遵循這4個小步驟:

1.寫入數(shù)據(jù)到緩沖區(qū)

2.調(diào)用 buffer.flip()

3.從緩沖區(qū)讀取數(shù)據(jù)

4.調(diào)用 buffer.clear() 或者 buffer.compact()

當(dāng)你將數(shù)據(jù)寫入Buffer時,Buffer會跟蹤你已經(jīng)寫入了多少數(shù)據(jù)。一旦你需要讀出數(shù)據(jù),你需要調(diào)用 flip() 方法將Buffer從寫模式轉(zhuǎn)換到讀模式。在讀模式,Buffer允許你將之前寫入的數(shù)據(jù)全部讀出。

一旦你已經(jīng)讀出了所有數(shù)據(jù),你需要清除Buffer,為下次寫入數(shù)據(jù)做準(zhǔn)備??梢酝ㄟ^以下兩種方法來完成:clear() 和 compact()。clear() 方法清除整個Buffer,而 compact() 方法僅僅清除你已經(jīng)讀出的Buffer,未讀數(shù)據(jù)會被移動到Buffer的開始位置,再次寫入的數(shù)據(jù)會追加到未讀數(shù)據(jù)的后面。

這是一個簡單的 Buffer 使用的例子,使用的 write, flip, read 和 clear 操作:

RandomAccessFile aFile = new RandomAccessFile("data/nio-data.txt", "rw");
FileChannel inChannel = aFile.getChannel();
//create buffer with capacity of 48 bytes
ByteBuffer buf = ByteBuffer.allocate(48);int bytesRead = inChannel.read(buf); //read into buffer.
while (bytesRead != -1) { buf.flip(); //make buffer ready for read
while(buf.hasRemaining()){
System.out.print((char) buf.get()); // read 1 byte at a time
} buf.clear(); //make buffer ready for writing
bytesRead = inChannel.read(buf);
}
aFile.close();

Buffer的三個屬性:容量,位置和限定符

Buffer本質(zhì)上是一塊你可以寫入數(shù)據(jù)的內(nèi)存區(qū)域,當(dāng)然你也可以在寫入之后讀出數(shù)據(jù)。該內(nèi)存區(qū)域被封裝成一個 NIO Buffer 對象,它提供一系列的方法,以方便對該內(nèi)存區(qū)域的操作。

為了學(xué)習(xí)Buffer 是如何工作的,Buffer 的三個屬性你必須要熟悉,它們是:

  • capacity (容量)
  • position (游標(biāo)位置)
  • limit (末尾限定符)

其中,position 和 limit 的意義依賴于當(dāng)前 Buffer 是處于讀模式還是寫模式。capacity 的含義無論讀寫模式都是相同的。

下面是對以上三個屬性在讀模式和寫模式的一個示例,后面會有詳細(xì)的解釋:

Java NIO Buffer過程詳解

Buffer capacity, position and limit in write and read mode.

Capacity (容量)

作為一個內(nèi)存塊,Buffer 有一個固定的大小,我們叫做 “capacity(容量)"。你最多只能向 Buffer 寫入 capacity 大小的字節(jié),長整數(shù),字符等。一旦 Buffer 滿了,你必須在繼續(xù)寫入數(shù)據(jù)之前清空它(讀出數(shù)據(jù),或清除數(shù)據(jù))。

Position (游標(biāo)位置)

當(dāng)你開始向 Buffer 寫入數(shù)據(jù)時,你必須知道數(shù)據(jù)將要寫入的位置。position 的初始值為 0。當(dāng)一個字節(jié)或長整數(shù)等類似數(shù)據(jù)類型被寫入 Buffer 后,position 就會指向下一個將要寫入數(shù)據(jù)的位置(根據(jù)數(shù)據(jù)類型大小計(jì)算)。position 的最大值是 capacity - 1。

當(dāng)你需要從 Buffer 讀出數(shù)據(jù)時,你也需要知道將要從什么位置開始讀數(shù)據(jù)。在你調(diào)用 flip 方法將 Buffer 從寫模式轉(zhuǎn)換為讀模式時,position 被重新設(shè)置為 0。然后你從 position 指向的位置開始讀取數(shù)據(jù),接下來 position 指向下一個你要讀取的位置。

限制(Limit)

在寫模式下對一個Buffer的限制即你能將多少數(shù)據(jù)寫入Buffer中。在寫模式下,限制等同于Buffer的容量(capacity)。

當(dāng)切換Buffer為讀模式時,限制表示你最多能讀取到多少數(shù)據(jù)。因此,當(dāng)切換Buffer為讀模式時,限制會被設(shè)置為寫模式下的position值。換句話說,你能讀到之前寫入的所有數(shù)據(jù)(限制被設(shè)置為已寫的字節(jié)數(shù),在寫模式下就是position)。

Buffer類型

Java NIO提出了如下幾種Buffer類型:

  • ByteBuffer
  • MappedByteBuffer
  • CharBuffer
  • DoubleBuffer
  • FloatBuffer
  • IntBuffer
  • LongBuffer
  • ShortBuffer

正如你所看到的,這些Buffer類型代表了不同的數(shù)據(jù)類型。換句話說,他們讓你可以在使用的時候用char, short, int, long, float 或者double類型來代替直接使用buffer中的字節(jié)。

其中MappedByteBuffer有點(diǎn)特殊,將在它自己的部分來闡述。

分配一個Buffer

若要獲取一個Buffer對象,必須先分配它。每個Buffer類都有allocate()函數(shù)用來分配。下面的例子展示了分配一個

ByteBuffer,其容量為48字節(jié)。

ByteBuffer buf = ByteBuffer.allocate(48);

下面的例子是分配一個具有1024個字符的空間的CharBuffer:

CharBuffer buf = CharBuffer.allocate(1024);

將數(shù)據(jù)寫入Buffer

有兩種方法可以將數(shù)據(jù)寫入Buffer:

1.從Channel將數(shù)據(jù)寫入Buffer

2.調(diào)用buffer的put()函數(shù),自己將數(shù)據(jù)寫入Buffer。

下面的例子是展示Channel如何將數(shù)據(jù)寫入到Buffer中:

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

下面的例子是通過put()函數(shù)將數(shù)據(jù)寫入Buffer:

buf.put(127);

put()函數(shù)還有很多其他版本,可以讓你使用不用的方法將數(shù)據(jù)寫入到Buffer。例如,在特定的位置寫,或者將字節(jié)數(shù)組寫入到buffer。查看JavaDoc來了解buffer實(shí)現(xiàn)的更多細(xì)節(jié)。

flip()

用 flip() 方法將 Buffer f從寫入模式切換到讀取模式。調(diào)用 flip() 將 position 設(shè)置回0,并將 limit 置為剛才的位置。

換句話說,position 現(xiàn)在標(biāo)記了讀取位置,limit 標(biāo)記了寫入緩沖區(qū)的字節(jié)、字符數(shù)等——可以讀取的字節(jié)數(shù)、字符數(shù)等的限制。

從緩沖區(qū)讀取數(shù)據(jù)

有兩種方法可以從 Buffer 中讀取數(shù)據(jù)。

1.從緩沖區(qū)讀取數(shù)據(jù)到通道。

2.使用緩沖區(qū)自帶方法中的 get() 方法從緩沖區(qū)讀取數(shù)據(jù)。

下面是如何將數(shù)據(jù)從緩沖區(qū)讀取到通道的例子:

//read from buffer into channel.
int bytesWritten = inChannel.write(buf);

下面是使用 get() 方法從 Buffer 中讀取數(shù)據(jù)的例子:

byte aByte = buf.get();

get() 方法還有許多其他版本,允許您以多種不同的方式從 Buffer 中讀取數(shù)據(jù)。 例如,在特定位置讀取,或者從緩沖區(qū)讀取字節(jié)數(shù)組。有關(guān)具體緩沖區(qū)實(shí)現(xiàn)的詳細(xì)信息,請參閱JavaDoc。

rewind()

Buffer.rewind() 將 position 設(shè)置回0,因此你可以重讀緩沖區(qū)中的所有數(shù)據(jù)。這個 limit 保持不變,因此仍然標(biāo)記有多少元素(字節(jié)、字符等)可以從Buffer讀取。

clear() and compact()

從 Buffer 中讀取數(shù)據(jù)之后,必須讓 Buffer 為再次寫入做好準(zhǔn)備。您可以通過調(diào)用 clear() 或調(diào)用 compact()來做到這一點(diǎn)。

如果您調(diào)用 clear() ,position 將被設(shè)置為0,并 limit 置為 capacity。換句話說,Buffer 被清除。Buffer 中的數(shù)據(jù)沒有清除。只有標(biāo)記告訴您可以將數(shù)據(jù)寫入 Buffer 的位置。

當(dāng)您調(diào)用 clear() 時,如果緩沖區(qū)中有任何未讀數(shù)據(jù),則數(shù)據(jù)將被“遺忘”,這意味著您不再有任何標(biāo)記來說明哪些數(shù)據(jù)已被讀取,哪些數(shù)據(jù)未被讀取。

如果 Buffer 中仍然有未讀數(shù)據(jù),并且您希望稍后讀取它,但是您需要先寫一些東西,那么調(diào)用 compact() 而不是 clear().

compact() 將所有未讀的數(shù)據(jù)復(fù)制到 Buffer 的開頭。然后將 position 設(shè)置為最后一個未讀元素之后的位置。與 clear() 一樣,limit 屬性仍然設(shè)置為 capacity?,F(xiàn)在 Buffer 已經(jīng)準(zhǔn)備好寫入,但是不會覆蓋未讀數(shù)據(jù)。

mark() and reset()

你可以調(diào)用 Buffer.mark() 方法在 Buffer 中標(biāo)記給定位置。之后,你可以調(diào)用 Buffer.reset() 方法重置回標(biāo)記的這個位置。下面是個例子:

buffer.mark();
//call buffer.get() a couple of times, e.g. during parsing.
buffer.reset(); //set position back to mark.

equals() and compareTo()

用equals() 和 compareTo()方法可以比較兩個緩沖區(qū)。

equals()

兩個緩沖相同,如果:

1.他們是同一個類型(byte,char,int等)。

2.在緩沖區(qū),它們遺留有相同量的字節(jié)、字符等。

3.所有遺留的字節(jié)、字符都相同。

正如你看到的,equals只比較Buffer的一部分,而不是每個元素。事實(shí)上,它只比較Buffer中遺留的元素。

compareTo()

用 compareTo() 方法比較兩個緩沖區(qū)的遺留元素(字節(jié)、字符等),用在例如排序例程。在下列情況中,一個緩沖區(qū)被視為“小于”另一個緩沖區(qū),如果:

與另一個緩沖區(qū)對應(yīng)元素相等的第一個元素,小于另一個緩沖區(qū)的元素。

所有的元素都相等,但是第一個緩沖區(qū)在第二個緩沖區(qū)之前耗盡了元素(它有更少的元素)。

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持創(chuàng)新互聯(lián)。


分享題目:JavaNIOBuffer過程詳解
本文路徑:http://weahome.cn/article/gcjdgo.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部