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没法控制对物理内存映射文件的引用释放)
 
 

你可能感兴趣的:(Java基础)