0%

NIO的缓冲区

最近需要对文件做一些处理,之前接触得比较多的还是基于流的IO,但现在用得比较多的还是NIO(New IO),可以理解为Non-blocking IO。

缓冲区(Buffer)

缓冲区主要是负责数据的存取的。

除了boolean这个基础类型外,其他数据类型都对应一个缓冲Buffer。

1
2
3
4
5
6
7
ByteBuffer
CharBuffer
ShortBuffer
IntBuffer
LongBuffer
FloatBuffer
DoubleBuffer

两个核心方法

1
2
put() 存入数据到缓冲区
get() 从缓冲区获取数据

四个核心属性

  • capacity

容量,一旦声明,不可改变

  • limit

界限,表示缓冲区可以操作数据的大小。limit后数据不能进行读写操作

  • position

位置,表示缓冲区正在操作数据的位置

  • mark

标记,记录当前position的位置,后续操作之后,可以通过reset()恢复到mark的位置。

实例

1. 分配一个指定大小的缓冲区

1
2
3
4
5
6
7
8
9
10
11
12
13
String str = "abcde";

ByteBuffer buffer = ByteBuffer.allocate(1024);

System.out.println("--- allocate() ---");
System.out.println(buffer.position());
System.out.println(buffer.limit());
System.out.println(buffer.capacity());
/**
* 0
* 1024
* 1024
*/

2. 执行put()把数据存入缓冲区

1
2
3
4
5
6
7
8
9
10
11
buffer.put(str.getBytes());

System.out.println("--- put() ---");
System.out.println(buffer.position());
System.out.println(buffer.limit());
System.out.println(buffer.capacity());
/**
* 5
* 1024
* 1024
*/

3. 切换到读取数据模式

1
2
3
4
5
6
7
8
9
10
11
buffer.flip();

System.out.println("--- flip() ---");
System.out.println(buffer.position());
System.out.println(buffer.limit());
System.out.println(buffer.capacity());
/**
* 0
* 5
* 1024
*/

4. 执行get()读取缓冲区数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
byte[] bytes = new byte[buffer.limit()];
buffer.get(bytes);

System.out.println("--- get() ---");
System.out.println(new String(bytes));

System.out.println(buffer.position());
System.out.println(buffer.limit());
System.out.println(buffer.capacity());
/**
* abcde
* 5
* 5
* 1024
*/

5. 重新读取缓冲区

1
2
3
4
5
6
7
8
9
10
11
buffer.rewind();

System.out.println("--- rewind() ---");
System.out.println(buffer.position());
System.out.println(buffer.limit());
System.out.println(buffer.capacity());
/**
* 0
* 5
* 1024
*/

6. mark/reset

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
buffer.get(bytes, 0, 2);
System.out.println(new String(bytes, 0, 2));
buffer.mark();
buffer.get(bytes, 2, 2);

buffer.reset();

System.out.println("--- reset() ---");
System.out.println(buffer.position());
System.out.println(buffer.limit());
System.out.println(buffer.capacity());
/**
* 2
* 5
* 1024
*/

if (buffer.hasRemaining()) {
System.out.println(buffer.remaining());
/**
* 3
*/
}

7. 清空缓冲区

1
2
3
4
5
6
7
8
9
10
11
buffer.clear();

System.out.println("--- clear() ---");
System.out.println(buffer.position());
System.out.println(buffer.limit());
System.out.println(buffer.capacity());
/**
* 0
* 1024
* 1024
*/