Java NIO是java用來提升java IO操做性能。基於網上的教程和一些資料對NIO的知識進行整理和總結java
底層是由數組實現並構成的,負責數據的存儲,不一樣的數據類型有對應類型的緩衝區,但容量是在Buffer對象聲明時指定的,Buffer對象一旦建立後,容量不能改變。經常使用的Buffer類型及對應的基本數據類型:數組
ByteBuffer (byte) CharBuffer (char) ShortBuffer (short) IntBuffer (int) LongBuffer (long) FloatBuffer (float) DoubleBuffer (double)
不一樣類型的Buffer管理緩衝區的方式都一致,經過allocate()方法獲取Buffer對象,且都是間接緩存區緩存
position:當前正在進行處理的數據在緩衝區的位置
limit:緩衝區中有效數據的範圍
capacity:緩衝區的最大容量
mark:用來記錄position所在的位置,與mark()、reset()方法聯合使用
例:以ByteBuffer爲例性能
ByteBuffer ByteBuffer = ByteBuffer.allocate(10);
put():向緩衝區存放數據
例:編碼
byteBuffer.put("hello".getBytes());
flip():切換緩衝區的讀寫狀態,
例:spa
byteBuffer.flip();
get():從緩存區獲取數據
例:code
byteBuffer.get();
rewind():使用get()方法從緩衝區獲取一部分或所有數據後,須要在從新從緩衝區中獲取數據,須要先調用rewind()方法,而後再使用get()方法
例:對象
byteBuffer.rewind();
mark():將緩衝區屬性position的當前取值賦給屬性mark,例:blog
byteBuffer.get(); byteBuffer.mark(); byteBuffer.get();
reset():將緩衝區屬性position的值重置爲以前調用mark()方法時的position的值
例:教程
byteBuffer.reset();
clear():重置緩衝區屬性position=0,屬性limit=capacity,這樣就沒法獲取到緩衝區中正確的數據了,可是clear()方法不會清空緩衝區中已存在的數據
例:
byteBuffer.clear();
0 <= mark <= position <= limit <= capacity
根據緩衝區在屋裏內存中的位置分爲:直接緩衝區、間接緩衝區
間接緩衝區:是在JVM的堆內存中進行建立的,JVM的GC可以管理緩衝區佔用的內存。使用間接緩衝區進行IO操做數據時,須要從用戶地址空間copy到內核地址空間,或是從內核地址空間copy到用戶地址空間,因此IO性能沒有直接緩衝區的好。
直接緩衝區:使用ByteBuffer.allocateDirect(1024)來建立直接緩衝區,直接緩衝區只有ByteBuffer類型。獨立與JVM內存以外的,存在於物理內存中的一塊內存區域;不收JVM的GC管理。JVM會盡最大努力在此緩衝區上執行本機IO操做以提升IO性能。因爲直接緩衝區在JVM內存以外,若是沒法進行有效管理容易形成物理內存溢出,所以最好僅在直接緩衝區能在性能方面帶來明顯好處時使用。
Scattering reads:分散讀取按照緩衝區的順序依次將數據讀取到應用程序中;
read(byte[])
Gathering writes:彙集寫入按照緩衝區的順序依次將應用程序中的數據寫入到緩衝區中:
write(byte[])
編碼:字符串轉換成字節數組的過程
解碼:字節數組轉換成字符串的過程
解碼和編碼過程當中,字符串與字節數組相互轉換使用到的字符集;經過Chartset.forName(charsetName)方法進行聲明