概述
Java NIO是面向缓冲区的,基于通道的IO操作。
缓冲区与通道的基本原理叙述
通道:类似于生活中的铁路,只用于连接,并没有数据的传输。
缓冲区:类似于火车,可以双向的传递数据,比如说:运城到太原的火车,在运城上乘客后(乘客数量小于火车容量)(可以认为就是在写数据),就可以往太原出发,(当然也可以在中途进行上下车)在太原后,乘客需要下车(类似于读数据),重要的是这个火车在太原可以再次进行装人(写数据),并将人运输到运城,以此类推。。。可知缓冲区是双向的存取。
由以上可知,在Java NIO中,由Channel面向传输,Buffer面向存储。
Java 缓冲区操作
负责存取数据,缓冲区就是数组,用于存储不同类型的数据,java根据数据类型的不同(Boolean类型除外),提供了相应的缓冲区。
- ByteBuffer
- CharBuffer
- IntBuffer
- ShortBuffer
- LongBuffer
- DoubleBuffer
以上数据类型都可以通过allocate()来获取缓冲区。
//创建缓冲区,分配一个指定大小(10)的缓冲区
ByteBuffer buf = ByteBuffer.allocate(10);
缓冲区:存取数据的核心方法包括两种
- put:存取数据到缓冲区
- get:获取缓冲区中的数据
四个主要核心属性:
- capacity:容量,表示缓冲区最大的存储量,一旦声明不能改变。
- limit:界限,表示缓冲区中可以操作数据的大小(limit后的数据不能进行操作)
- position:位置,表示缓冲区正在操作的数据的位置。
- 关系:position<=limit<=capacity
System.out.println(buf.position());
System.out.println(buf.capacity());
System.out.println(buf.limit());
输出:0,10,10
图解:
//利用put方法,存入数据到缓冲区
String str = "abcde";
buf.put(str.getBytes());
System.out.println(buf.position());
System.out.println(buf.capacity());
System.out.println(buf.limit());
输出:5,10,10
图解:
//利用flip()方法,改变缓冲区模式将缓冲区从写模式改变为读模式
buf.flip();
System.out.println(buf.position());
System.out.println(buf.capacity());
System.out.println(buf.limit());
输出:0.10.5
图解:
//利用get方法读取数据
byte [] bytes = new byte[buf.limit()];
buf.get(bytes);
System.out.println(new String(bytes));
输出:abcde
图解:
//清空缓冲区,使缓冲区回到最初的状态,数据并没有清除,只是处于“被遗忘”状态
buf.clear();
System.out.println(buf.position());
System.out.println(buf.capacity());
System.out.println(buf.limit());
输出:0,10,10
//利用get方法来验证被遗忘的数据
System.out.println((char)buf.get());
输出:a
前面提及是四个核心属性,上面只涉及前三个比较重要的属性,现在来说明最后一个不是很重要的属性。
- Mark可以记录当前position的位置,可以通过reset函数回到mark标记的位置。
String str = "abcde";
// 申请大小为10的缓冲区
ByteBuffer buf = ByteBuffer.allocate(10);
// 将数据存入缓冲区
buf.put(str.getBytes());
buf.flip();
byte[] bytes = new byte[buf.limit()]; buf.get(bytes, 0, 2);
System.out.println(new String(bytes, 0, 2)); buf.mark();
buf.get(bytes, 0, 2);
System.out.println(new String(bytes, 0, 2));
buf.reset();
buf.get(bytes, 0, 2);
System.out.println(new String(bytes, 0, 2));
输出:ab cd cd
图解:
申请:
存入数据:
读取数据:
mark标记:
读取数据:
reset:
读取数据: