最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java NIO Buffer過程詳解

 更新時間:2019年06月13日 10:07:22   作者:xiaoaiwhc1, kevinlinkai, 琪花億草, 溪邊九節(jié)  
這篇文章主要介紹了Java NIO Buffer過程詳解,緩沖區(qū)在java nio中負(fù)責(zé)數(shù)據(jù)的存儲。緩沖區(qū)就是數(shù)組。用于存儲不同數(shù)據(jù)類型的數(shù)據(jù)。,需要的朋友可以參考下

前言

在與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ì)的解釋:

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í)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 如何使用ByteArrayOutputStream下載文件

    如何使用ByteArrayOutputStream下載文件

    這篇文章主要介紹了如何使用ByteArrayOutputStream下載文件方式,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • java實(shí)現(xiàn)簡易飛機(jī)大戰(zhàn)

    java實(shí)現(xiàn)簡易飛機(jī)大戰(zhàn)

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)簡易飛機(jī)大戰(zhàn),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • SpringBoot實(shí)現(xiàn)Thymeleaf驗(yàn)證碼生成

    SpringBoot實(shí)現(xiàn)Thymeleaf驗(yàn)證碼生成

    本文使用SpringBoot實(shí)現(xiàn)Thymeleaf驗(yàn)證碼生成,使用后臺返回驗(yàn)證碼圖片,驗(yàn)證碼存到session中后端實(shí)現(xiàn)校驗(yàn),前端只展示驗(yàn)證碼圖片。感興趣的可以了解下
    2021-05-05
  • Java網(wǎng)絡(luò)編程之IO模型阻塞與非阻塞簡要分析

    Java網(wǎng)絡(luò)編程之IO模型阻塞與非阻塞簡要分析

    這篇文章主要介紹Java網(wǎng)絡(luò)編程中的IO模型阻塞與非阻塞簡要分析,文中附有示例代碼,有需要的朋友可以借鑒參考下,希望能夠有所幫助
    2021-09-09
  • Spring boot 添加jsp支持配置詳解

    Spring boot 添加jsp支持配置詳解

    本篇文章主要介紹了Spring boot 添加jsp支持配置詳解,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-06-06
  • Java構(gòu)建高效結(jié)果緩存方法示例

    Java構(gòu)建高效結(jié)果緩存方法示例

    這篇文章主要介紹了Java構(gòu)建高效結(jié)果緩存方法示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-04-04
  • SpringCloud中的斷路器(Hystrix)和斷路器監(jiān)控(Dashboard)

    SpringCloud中的斷路器(Hystrix)和斷路器監(jiān)控(Dashboard)

    本篇主要介紹的是SpringCloud中的斷路器(Hystrix)和斷路器指標(biāo)看板(Dashboard)的相關(guān)使用知識,需要的朋友可以參考下
    2019-06-06
  • Spring?AOP實(shí)現(xiàn)聲明式事務(wù)機(jī)制源碼解析

    Spring?AOP實(shí)現(xiàn)聲明式事務(wù)機(jī)制源碼解析

    這篇文章主要為大家介紹了Spring?AOP實(shí)現(xiàn)聲明式事務(wù)機(jī)制源碼解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-12-12
  • Mybatis-Plus或PageHelper多表分頁查詢總條數(shù)不對問題的解決方法

    Mybatis-Plus或PageHelper多表分頁查詢總條數(shù)不對問題的解決方法

    PageHelper 這個插件用了很多次了,今天使用的時候才遇到一個問題,這篇文章主要給大家介紹了關(guān)于Mybatis-Plus或PageHelper多表分頁查詢總條數(shù)不對問題的解決方法,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-08-08
  • Spring使用注解存儲Bean對象的方法詳解

    Spring使用注解存儲Bean對象的方法詳解

    在使用學(xué)習(xí)使用 Spring過程中,當(dāng)我們要實(shí)現(xiàn)一個功能的時候,先應(yīng)該考慮的是有沒有相應(yīng)的注解是實(shí)現(xiàn)對應(yīng)功能的,Spring 中很多功能的配置都是可以依靠注解實(shí)現(xiàn)的,而本篇中介紹的是使用注解來存儲 Bean 對象
    2023-07-07

最新評論

长沙县| 绿春县| 庆元县| 汉中市| 平塘县| 高青县| 太康县| 那曲县| 琼结县| 北安市| 鸡西市| 左云县| 屏东市| 肥城市| 芦山县| 章丘市| 同德县| 湖北省| 开封县| 商城县| 江安县| 绥阳县| 繁峙县| 南丹县| 始兴县| 祥云县| 集贤县| 防城港市| 兴安盟| 手游| 札达县| 桦川县| 万年县| 滕州市| 当阳市| 托里县| 徐州市| 遂昌县| 惠安县| 瓦房店市| 建昌县|