最近需要对文件做一些处理,之前接触得比较多的还是基于流的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() 从缓冲区获取数据
|
四个核心属性
容量,一旦声明,不可改变
界限,表示缓冲区可以操作数据的大小。limit后数据不能进行读写操作
位置,表示缓冲区正在操作数据的位置
标记,记录当前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());
|
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());
|
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());
|
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());
|
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());
|
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());
if (buffer.hasRemaining()) { System.out.println(buffer.remaining());
}
|
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());
|