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-05Java 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-04Java?詳解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-11Spring Web MVC框架學(xué)習(xí)之配置Spring Web MVC
這一篇文章講的是Spring Web MVC各部分的配置方法,包括Java代碼配置和XML文件配置以及MVC命名空間的使用方法。2017-03-03最新評論