1. 程式人生 > >Java NIO中的緩衝區

Java NIO中的緩衝區



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
二、往緩衝區裡寫資料(寫資料模式): 1
String str = "hello";
2
byteBuffer.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
二、往緩衝區裡寫資料(寫資料模式): 1
String str = "hello";
2
byteBuffer.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沒法控制對實體記憶體對映檔案的引用釋放)