【Netty】NIO 缓冲区 ( Buffer ) ( 缓冲区读写类型 | 只读缓冲区 | 映射字节缓冲区 )
文章目錄
- I . 緩沖區 ( Buffer ) 存取類型
- II . 只讀緩沖區 ( ReadOnlyBuffer )
- III . 映射字節緩沖區 ( MappedByteBuffer )
I . 緩沖區 ( Buffer ) 存取類型
1 . 緩沖區 ( Buffer ) 數據讀寫類型 注意點 : 以 字節緩沖區 ( ByteBuffer ) 為例 ;
① 向 字節緩沖區 ( ByteBuffer ) 中放入數據 :
- 放入 Int 類型數據 : ByteBuffer putInt(int value) ;
- 放入 Double 類型數據 : ByteBuffer putDouble(double value) ;
- 放入 Short 類型數據 : ByteBuffer putShort(short value) ;
② 從 字節緩沖區 ( ByteBuffer ) 中讀取數據 :
- 取出 Int 類型數據 : int getInt() ;
- 取出 Double 類型數據 : double getDouble() ;
- 取出 Short 類型數據 : short getShort() ;
③ 讀取數據注意點 : 讀取 字節緩沖區 ( ByteBuffer ) 數據時 , 必須按照放入 字節緩沖區 ( ByteBuffer ) 中的數據進行 , 否則就會讀出錯誤數據 , 或亂碼 ;
④ 讀取溢出 : 讀取 或 寫出時 , position 一定不能超過 limit , 否則就會報 BufferUnderFlowException 異常 ;
Exception in thread "main" java.nio.BufferUnderflowExceptionat java.nio.Buffer.nextGetIndex(Buffer.java:506)at java.nio.HeapByteBuffer.getInt(HeapByteBuffer.java:361)at kim.hsl.nio.BufferDemo2.main(BufferDemo2.java:23)代碼示例 :
package kim.hsl.nio;import java.nio.ByteBuffer;public class BufferDemo2 {public static void main(String[] args) {//1 . 創建一個存儲 Int 類型數據的 Buffer , 可以存儲 1024 個字節ByteBuffer buffer = ByteBuffer.allocate(1024);//2 . 向緩沖區中放入數據buffer.putInt(8888);buffer.putDouble(88.888);buffer.putShort((short) 888);//3 . 寫入轉讀取前先翻轉, 將 position 設置為 0buffer.flip();//4 . 從緩沖區中讀取數據int intValue = buffer.getInt();double doubleValue = buffer.getDouble();short shortValue = buffer.getShort();//已經讀取完了, 在讀取就溢出了 java.nio.BufferUnderflowException//buffer.getInt();//5 . 打印讀取的數據信息System.out.println(String.format("intValue = %d, doubleValue = %f, shortValue = %d", intValue, doubleValue, shortValue));} }執行結果 :
intValue = 8888, doubleValue = 88.888000, shortValue = 888II . 只讀緩沖區 ( ReadOnlyBuffer )
1 . 只讀 緩沖區 ( ReadOnlyBuffer ) :
① 只讀緩沖區 ( ReadOnlyBuffer ) 獲取 : 先創建一個 Buffer 對象 , 向其中存儲數據 , 調用 asReadOnlyBuffer() 方法 , 可以返回一個只讀緩沖區 , 該緩沖區 , 只能讀取 , 不能寫入 ;
② 實際類型 : 只讀緩沖區的類型是 HeapByteBufferR ;
③ 只讀緩沖區寫入數據異常 : 該 只讀緩沖區 ( ReadOnlyBuffer ) 只能讀取數據 , 不能向其中寫入數據 ; 如果寫入數據 , 就會報異常 ;
Exception in thread "main" java.nio.ReadOnlyBufferExceptionat java.nio.HeapByteBufferR.putShort(HeapByteBufferR.java:324)at kim.hsl.nio.BufferDemo3.main(BufferDemo3.java:28)2 . 示例代碼 :
package kim.hsl.nio;import java.nio.ByteBuffer;public class BufferDemo3 {public static void main(String[] args) {//1 . 創建一個存儲 Int 類型數據的 Buffer , 可以存儲 1024 個字節ByteBuffer buffer = ByteBuffer.allocate(1024);//2 . 向緩沖區中放入數據buffer.putInt(8888);buffer.putDouble(88.888);buffer.putShort((short) 888);//3 . 寫入轉讀取前先翻轉, 將 position 設置為 0buffer.flip();//4 . 將上述緩沖區轉為只讀緩沖區ByteBuffer readOnlyBuffer = buffer.asReadOnlyBuffer();//5 . 從緩沖區中讀取數據int intValue = readOnlyBuffer.getInt();double doubleValue = readOnlyBuffer.getDouble();short shortValue = readOnlyBuffer.getShort();//已經讀取完了, 在讀取就溢出了 java.nio.BufferUnderflowException//buffer.getInt();//向只讀緩沖區中存放數據拋 java.nio.ReadOnlyBufferException 異常//readOnlyBuffer.putShort((short) 888);//5 . 打印讀取的數據信息System.out.println(String.format("intValue = %d, doubleValue = %f, shortValue = %d",intValue, doubleValue, shortValue));} }執行結果 :
intValue = 8888, doubleValue = 88.888000, shortValue = 888III . 映射字節緩沖區 ( MappedByteBuffer )
1 . 映射字節緩沖區 ( MappedByteBuffer ) : 在內存中修改文件 , 不需要將文件中的內容拷貝到內存中 , 再修改后 , 寫回到文件 , 其性能提高了很多 ;
① 內存說明 : 修改文件的內存并不是堆內存 , 而是在堆外內存中 ;
② MappedByteBuffer 類結構 :
- MappedByteBuffer 繼承 ByteBuffer 抽象類 ;
- MappedByteBuffer 本身也是抽象類 , 其有兩個子類 , 分別是 DirectByteBuffer , DirectByteBufferR ;
③ 可操作區域 : fc.map(FileChannel.MapMode.READ_WRITE, 0, 10); 的 MappedByteBuffer 只能操作 從 0 索引開始的 10 個字節 , 即從 0 到 9 索引代表的字節 , 其中的 10 代表可操作性的字節個數 , 并不是索引值 ;
2 . 代碼示例 :
package kim.hsl.nio;import java.io.IOException; import java.io.RandomAccessFile; import java.nio.MappedByteBuffer; import java.nio.channels.FileChannel;public class MappedByteBufferDemo {public static void main(String[] args) {RandomAccessFile randomAccessFile = null;try {randomAccessFile = new RandomAccessFile("file.txt", "rw");FileChannel fc = randomAccessFile.getChannel();//FileChannel.MapMode.READ_WRITE : 指的是讀寫模式//0 : 將文件從 0 位置開始映射到內存中//10 : 將文件從 0 位置開始映射到內存中的大小//即 將 file.txt 文件從 0 開始的 10 字節映射到內存中MappedByteBuffer mappedByteBuffer = fc.map(FileChannel.MapMode.READ_WRITE, 0, 10);mappedByteBuffer.put(0, (byte) 'N');mappedByteBuffer.put(1, (byte) 'N');} catch (IOException e) {e.printStackTrace();} finally {try {if(randomAccessFile != null)randomAccessFile.close();} catch (IOException e) {e.printStackTrace();}}} }執行結果 : 在 IntelliJ IDEA 環境中打開沒有刷新 , 在文件瀏覽器中打開 , “Hello World” 的前兩位變成了 “NN” ;
總結
以上是生活随笔為你收集整理的【Netty】NIO 缓冲区 ( Buffer ) ( 缓冲区读写类型 | 只读缓冲区 | 映射字节缓冲区 )的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Netty】NIO 通道 ( Chan
- 下一篇: 【Netty】NIO 缓冲区 ( Buf