Java NIO中的緩衝區
阿新 • • 發佈:2019-02-11
1
*資料型別(除boolean)
2* ByteBuffer
3* CharBuffer
4* ShortBuffer
5* IntBuffer
6* LongBuffer
7* FloatBuffer
8* DoubleBuffer
9*
10* 二、存資料put取資料get
11*
12* 三、4個核心屬性:
13* capacity容量(緩衝區最大容量)、
14* limit界限(緩衝區可以操作資料的大小)、
15* position位置(緩衝區中正在操作資料的位置)、
16* mark標記(記住當前position,可以用reset方法回到這個位置)
17*
18* 0 <= mark <= position <= limit <= capacity
一、初始化一個ByteBuffer位元組緩衝區:
1
//分配一個指定大小的緩衝區
2
ByteBuffer byteBuffer = ByteBuffer.allocate(10);
3
//capacity = 10
4
//limit = 10
5
//position = 0
二、往緩衝區裡寫資料(寫資料模式):
1String str = "hello";
2byteBuffer.put(str.getBytes());
3//capacity = 10
4//limit = 10
5//position = 5
三、從緩衝區中讀資料(讀資料模式):
1
//1.切換成讀資料模式
2
byteBuffer.flip();
3
//capacity = 10
4
//limit = 5
5
//position = 0
6
7
//2.讀資料,往位元組陣列barr裡面存
8
byte[] barr = new byte[byteBuffer.limit()];
9
byteBuffer.get(barr);
10
//capacity = 10
11
//limit = 5
12
//position = 5
13
14
//3.重複再回到初始位置開始讀(回到狀態1)
15
byteBuffer.rewind();
16
//capacity = 10
17
//limit = 5
18
//position = 0
19
20
//4.清空緩衝區(緩衝區還存在,資料,只是被遺忘了)
21
byteBuffer.clear();
22
//capacity = 10
23
//limit = 10
24
//position = 0
25
System.out.println((char)byteBuffer.get());//還是能讀到資料的
四、直接緩衝區和非直接緩衝區
1.非直接緩衝區(用allocate方法建立的緩衝區、普通IO建立的快取區):
應用程式讀取物理磁碟檔案的過程:
不是直接讀取,需要JVM向作業系統OS的實體記憶體請求資料,實體記憶體再向檔案請求讀資料才能獲取。這樣效率非常低。
2.直接緩衝區(用allocateDirect方法建立緩衝區) 應用程式直接從物理對映檔案中讀寫磁碟檔案資料(加快讀寫操作,但有一定的安全風險,因為JVM沒法控制對實體記憶體對映檔案的引用釋放) 1
*資料型別(除boolean)
2* ByteBuffer
3* CharBuffer
4* ShortBuffer
5* IntBuffer
6* LongBuffer
7* FloatBuffer
8* DoubleBuffer
9*
10* 二、存資料put取資料get
11*
12* 三、4個核心屬性:
13* capacity容量(緩衝區最大容量)、
14* limit界限(緩衝區可以操作資料的大小)、
15* position位置(緩衝區中正在操作資料的位置)、
16* mark標記(記住當前position,可以用reset方法回到這個位置)
17*
18* 0 <= mark <= position <= limit <= capacity
一、初始化一個ByteBuffer位元組緩衝區:
1
//分配一個指定大小的緩衝區
2
ByteBuffer byteBuffer = ByteBuffer.allocate(10);
3
//capacity = 10
4
//limit = 10
5
//position = 0
二、往緩衝區裡寫資料(寫資料模式):
1String str = "hello";
2byteBuffer.put(str.getBytes());
3//capacity = 10
4//limit = 10
5//position = 5
三、從緩衝區中讀資料(讀資料模式):
1
//1.切換成讀資料模式
2
byteBuffer.flip();
3
//capacity = 10
4
//limit = 5
5
//position = 0
6
7
//2.讀資料,往位元組陣列barr裡面存
8
byte[] barr = new byte[byteBuffer.limit()];
9
byteBuffer.get(barr);
10
//capacity = 10
11
//limit = 5
12
//position = 5
13
14
//3.重複再回到初始位置開始讀(回到狀態1)
15
byteBuffer.rewind();
16
//capacity = 10
17
//limit = 5
18
//position = 0
19
20
//4.清空緩衝區(緩衝區還存在,資料,只是被遺忘了)
21
byteBuffer.clear();
22
//capacity = 10
23
//limit = 10
24
//position = 0
25
System.out.println((char)byteBuffer.get());//還是能讀到資料的
四、直接緩衝區和非直接緩衝區
1.非直接緩衝區(用allocate方法建立的緩衝區、普通IO建立的快取區):
應用程式讀取物理磁碟檔案的過程:
不是直接讀取,需要JVM向作業系統OS的實體記憶體請求資料,實體記憶體再向檔案請求讀資料才能獲取。這樣效率非常低。
2.直接緩衝區(用allocateDirect方法建立緩衝區)
應用程式直接從物理對映檔案中讀寫磁碟檔案資料(加快讀寫操作,但有一定的安全風險,因為JVM沒法控制對實體記憶體對映檔案的引用釋放)