Java?NIO緩沖區(qū)Buffer基礎(chǔ)教程示例
概念
緩沖區(qū)(Buffer)本質(zhì)上是管理著基本元數(shù)對象的數(shù)組
Buffer家族

Buffer基本屬性
/** Invariants: mark <= position <= limit <= capacity */ //用來臨時標(biāo)記position的位置,便于還原 private int mark = -1; //即將讀取或?qū)懭氲拈_始位置 private int position = 0; //上界,緩沖區(qū)現(xiàn)有元素的數(shù)量 private int limit; //緩存區(qū)的最大容量,初始化時設(shè)定,不能改變 private int capacity;
Buffer基本API
package java.nio;
public abstract class Buffer {
//獲取緩沖區(qū)容量
public final int capacity()
//獲取當(dāng)前位置
public final int position()
//設(shè)置一個新的position
public final Buffer position(int newPosition)
//獲取上界位置
public final int limit()
//設(shè)置一個新的上界位置,但是不能小于0或超過capacity
public final Buffer limit(int newLimit)
//標(biāo)記當(dāng)前position
public final Buffer mark()
//恢復(fù)標(biāo)記的position
public final Buffer reset()
//重新設(shè)置mark=-1 position=0 limit=capacity,讀取完數(shù)據(jù)調(diào)用,數(shù)據(jù)沒有被清理,寫入的數(shù)據(jù)會覆蓋之前的數(shù)據(jù)
public final Buffer clear()
//翻轉(zhuǎn)緩沖區(qū),使寫入的數(shù)據(jù)進(jìn)入可讀狀態(tài)
public final Buffer flip()
//重置讀寫位置,將position設(shè)為0,mark設(shè)為-1丟棄
public final Buffer rewind()
//獲取當(dāng)前位置好緩沖區(qū)上界Limit還有多少元素
public final int remaining()
//判斷position是否已經(jīng)達(dá)到limit上界,用于判斷是否已經(jīng)全部讀取完畢
public final boolean hasRemaining()
//判斷當(dāng)前緩沖區(qū)是否是只讀的
public abstract boolean isReadOnly();
}填充Hello后的緩沖區(qū)
ByteBuffer buffer=ByteBuffer.allocate(10); buffer.put((byte)'H').put((byte)'e').put((byte)'l').put((byte)'l').put((byte)'o');

調(diào)用flip翻轉(zhuǎn)后的緩沖區(qū)
buffer.flip();

直接緩沖區(qū)直接緩沖區(qū)是指java虛擬機(jī)堆棧外的系統(tǒng)存儲區(qū),通常情況通道之間的緩沖區(qū)數(shù)據(jù)傳輸不能直接使用非直接緩沖區(qū),而是會創(chuàng)建臨時直接緩沖區(qū)來復(fù)制數(shù)據(jù)后傳輸,這樣導(dǎo)致性能損耗。如果是高并發(fā)情況下重復(fù)使用緩沖區(qū),使用直接緩沖區(qū)可以提高IO性能。但是創(chuàng)建直接緩沖區(qū)需要繞過JVM直接操作本地系統(tǒng),這樣的創(chuàng)建和銷毀動作需要更高的成本。
緩沖區(qū)的創(chuàng)建方式
以ByteBuffer為例
//創(chuàng)建一個直接緩沖區(qū) ByteBuffer buffer = ByteBuffer.allocateDirect(1024);
//創(chuàng)建一個間接緩沖區(qū) ByteBuffer buffer = ByteBuffer.allocate(1024);
//創(chuàng)建一個只讀的備份緩沖區(qū) byte[] bytes = "hello".getBytes(); ByteBuffer buffer = ByteBuffer.wrap(bytes);
以上就是Java NIO緩沖區(qū)Buffer基礎(chǔ)教程示例的詳細(xì)內(nèi)容,更多關(guān)于Java NIO緩沖區(qū)Buffer的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
springMVC配置環(huán)境實現(xiàn)文件上傳和下載
這篇文章主要為大家詳細(xì)介紹了springMVC配置環(huán)境實現(xiàn)文件上傳和下載的相關(guān)資料,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2016-05-05
Java excel數(shù)據(jù)導(dǎo)入mysql的實現(xiàn)示例詳解
今天教大家如何使用Java將excel數(shù)據(jù)導(dǎo)入MySQL,文中有非常詳細(xì)的代碼示例,對正在學(xué)習(xí)java的小伙伴呢很有幫助,需要的朋友可以參考下2022-08-08
必須掌握的十個Lambda表達(dá)式簡化代碼提高生產(chǎn)力
這篇文章主要為大家介紹了必須掌握的十個Lambda表達(dá)式來簡化代碼提高生產(chǎn)力,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-04-04
Java?詳解Collection集合之ArrayList和HashSet
本章具體介紹了ArrayList和HashSet兩種集合的基本使用方法和區(qū)別,圖解穿插代碼實現(xiàn)。?JAVA成仙路從基礎(chǔ)開始講,后續(xù)會講到JAVA高級,中間會穿插面試題和項目實戰(zhàn),希望能給大家?guī)韼椭?/div> 2022-03-03
如何解決@value獲取不到y(tǒng)aml數(shù)組的問題
文章介紹了在使用YAML配置文件時,通過@Value注解獲取整數(shù)和數(shù)組列表的配置方法,并提供了兩種解決方案:一種適用于非嵌套列表,另一種適用于嵌套列表等復(fù)雜配置2024-11-11
Spring Web MVC框架學(xué)習(xí)之配置Spring Web MVC
這一篇文章講的是Spring Web MVC各部分的配置方法,包括Java代碼配置和XML文件配置以及MVC命名空間的使用方法。2017-03-03最新評論

