摘要:獨立與內存之外的,存在于物理內存中的一塊內存區域不收的管理。由于直接緩沖區在內存之外,如果無法進行有效管理容易造成物理內存溢出,因此最好僅在直接緩沖區能在性能方面帶來明顯好處時使用。
Java NIO是java用來提高java IO操作性能。基于網上的教程和一些資料對NIO的知識進行整理和總結
緩沖區Buffer
底層是由數組實現并構成的,負責數據的存儲,不同的數據類型有對應類型的緩沖區,但容量是在Buffer對象聲明時指定的,Buffer對象一旦創建后,容量不能改變。常用的Buffer類型及對應的基本數據類型:
ByteBuffer (byte) CharBuffer (char) ShortBuffer (short) IntBuffer (int) LongBuffer (long) FloatBuffer (float) DoubleBuffer (double)
不同類型的Buffer管理緩沖區的方式都一致,通過allocate()方法獲取Buffer對象,且都是間接緩存區
Buffer的相關屬性
position:當前正在進行處理的數據在緩沖區的位置
limit:緩沖區中有效數據的范圍
capacity:緩沖區的最大容量
mark:用來記錄position所在的位置,與mark()、reset()方法聯合使用
例:以ByteBuffer為例
ByteBuffer ByteBuffer = ByteBuffer.allocate(10);
Buffer的相關常用方法
put():向緩沖區存放數據
例:
byteBuffer.put("hello".getBytes());
flip():切換緩沖區的讀寫狀態,
例:
byteBuffer.flip();
get():從緩存區獲取數據
例:
byteBuffer.get();
rewind():使用get()方法從緩沖區獲取一部分或全部數據后,需要在重新從緩沖區中獲取數據,需要先調用rewind()方法,然后再使用get()方法
例:
byteBuffer.rewind();
mark():將緩沖區屬性position的當前取值賦給屬性mark,例:
byteBuffer.get(); byteBuffer.mark(); byteBuffer.get();
reset():將緩沖區屬性position的值重置為之前調用mark()方法時的position的值
例:
byteBuffer.reset();
clear():重置緩沖區屬性position=0,屬性limit=capacity,這樣就無法獲取到緩沖區中正確的數據了,但是clear()方法不會清空緩沖區中已存在的數據
例:
byteBuffer.clear();
Buffer相關屬性的取值范圍
0 <= mark <= position <= limit <= capacity
直接緩沖區
根據緩沖區在屋里內存中的位置分為:直接緩沖區、間接緩沖區
間接緩沖區:是在JVM的堆內存中進行創建的,JVM的GC能夠管理緩沖區占用的內存。使用間接緩沖區進行IO操作數據時,需要從用戶地址空間copy到內核地址空間,或是從內核地址空間copy到用戶地址空間,所以IO性能沒有直接緩沖區的好。
直接緩沖區:使用ByteBuffer.allocateDirect(1024)來創建直接緩沖區,直接緩沖區只有ByteBuffer類型。獨立與JVM內存之外的,存在于物理內存中的一塊內存區域;不收JVM的GC管理。JVM會盡最大努力在此緩沖區上執行本機IO操作以提高IO性能。由于直接緩沖區在JVM內存之外,如果無法進行有效管理容易造成物理內存溢出,因此最好僅在直接緩沖區能在性能方面帶來明顯好處時使用。
NIO分散讀取和聚集寫入
Scattering reads:分散讀取按照緩沖區的順序依次將數據讀取到應用程序中;
read(byte[])
Gathering writes:聚集寫入按照緩沖區的順序依次將應用程序中的數據寫入到緩沖區中:
write(byte[])
NIO字符集
編碼:字符串轉換成字節數組的過程
解碼:字節數組轉換成字符串的過程
解碼和編碼過程中,字符串與字節數組相互轉換使用到的字符集;通過Chartset.forName(charsetName)方法進行聲明
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/68636.html
摘要:從通道進行數據寫入創建一個緩沖區,填充數據,并要求通道寫入數據。三之通道主要內容通道介紹通常來說中的所有都是從通道開始的。從中選擇選擇器維護注冊過的通道的集合,并且這種注冊關系都被封裝在當中停止選擇的方法方法和方法。 由于內容比較多,我下面放的一部分是我更新在我的微信公眾號上的鏈接,微信排版比較好看,更加利于閱讀。每一篇文章下面我都把文章的主要內容給列出來了,便于大家學習與回顧。 Ja...
摘要:而我們現在都已經發布了,的都不知道,這有點說不過去了。而對一個的讀寫也會有響應的描述符,稱為文件描述符,描述符就是一個數字,指向內核中的一個結構體文件路徑,數據區等一些屬性。 前言 只有光頭才能變強 回顧前面: 給女朋友講解什么是代理模式 包裝模式就是這么簡單啦 本來我預想是先來回顧一下傳統的IO模式的,將傳統的IO模式的相關類理清楚(因為IO的類很多)。 但是,發現在整理的過程已...
摘要:操作系統是能夠獲取到事件操作完成的事件,基于回調函數機制和操作系統的操作控制實現事件檢測機制。 前面的文章NIO基礎知識介紹了Java NIO的一些基本的類及功能說明,Java NIO是用來替換java 傳統IO的,NIO的一些新的特性在網絡交互方面會更加的明顯。 Java 傳統IO的弊端 ????基于JVM來實現每個通道的輪詢檢查通道狀態的方法是可行的,但仍然是有問題的,檢查每個通道...
摘要:學習和掌握技術已經不是一個攻城獅的加分技能,而是一個必備技能。是雙向的,不僅可以讀取數據還能保存數據,程序不能直接讀寫通道,只與緩沖區交互為了讓大家不被高并發與大量連接處理問題所困擾,動力節點推出了高效處理模型應用教程。 大家肯定了解Java IO, 但是對于NIO一般是陌生的,而現在使用到NIO的場景越來越多,很多技術框...
摘要:通過協議向網絡讀寫數據通過協議向網絡讀寫數據以一個服務器的形式,監聽到來的連接,對每個連接建立一個。 Java NIO 教程 NIO是什么? 它是Java1.4之后出現的IO API,與傳統IO和網絡API不同,具有非阻塞的特點。 在BIO中我們使用字節流和字符流。NIO中我們使用channel和buffer。數據總是從一個channel中讀取到buffer中,或者從buffer中寫入...
閱讀 2364·2021-11-11 16:54
閱讀 2612·2021-09-26 09:47
閱讀 3987·2021-09-08 09:36
閱讀 2735·2021-07-25 21:37
閱讀 931·2019-08-30 15:54
閱讀 2543·2019-08-30 14:22
閱讀 3253·2019-08-30 13:57
閱讀 2580·2019-08-29 17:17