1.介绍
NIO:编程jdk1.4在IO基础上进行改进(NIO中有一个非阻塞IO,面向于缓冲区);
IO:里全是阻塞IO,面向流;
NIO和IO相比较起来效率更高.
2.分类
分类
(1)ByteBuffer:最常用
(2)LongBuffer
(3)IntegerBuffer
(4)FloatBUffer
(5)DubboBUffer
参数
(1)position = 0;缓冲区正在操作的位置,默认为0开始.
(2)limit; 界面(缓冲区可用大小,不是剩余大小).
(3)capacity;缓冲区最大容量,一旦声明是不能改变的.
public class BuffTest {
@Test
public void test1(){
//初始化大小
ByteBuffer buffer = ByteBuffer.allocate(1024);
System.out.println(buffer.position());
System.out.println(buffer.limit());
System.out.println(buffer.capacity());
System.out.println("*************存放数据");
buffer.put("abc".getBytes());
System.out.println(buffer.position());
System.out.println(buffer.limit());
System.out.println(buffer.capacity());
System.out.println("*************读取数据");
//开启读取模式,如果不加这行,运行会报错.
buffer.flip();
System.out.println(buffer.position());
System.out.println(buffer.limit());
System.out.println(buffer.capacity());
byte[] bytes = new byte[buffer.limit()];
//读取的时候,取的position是多少,当读取完position就是多少,不会回到0
buffer.get(bytes);
System.out.println(new String(bytes,0,bytes.length));
//可重复读,position不会重新开始,而是获取上一次的值
buffer.rewind();
System.out.println(buffer.position());
System.out.println(buffer.limit());
System.out.println(buffer.capacity());
byte[] bytes2 = new byte[buffer.limit()];
buffer.get(bytes2);
System.out.println(new String(bytes2,0,bytes2.length));
System.out.println("清空缓冲区");
//只是把下标(position)还原了,limit还原,但是数据还在
buffer.clear();
}
}
结果:
0
1024
1024
*************存放数据
3
1024
1024
*************读取数据
0
3
1024
abc
*************重复读取
0
3
1024
abc
清空缓冲区
3.mark和reset
mark标记现在position的值,reset就是拿到标记的值,赋给现在的position
例子:
public static void main(String[] args) {
ByteBuffer buffer = ByteBuffer.allocate(10);
String str = "abcd";
buffer.put(str.getBytes());
//开始读的模式
buffer.flip();
byte[] bytes = new byte[buffer.limit()];
//如果我取2个,position就为2,如果取4,position就为4
buffer.get(bytes,0,2);
System.out.println(new String(bytes,0,2));
System.out.println(buffer.position());
System.out.println("----------------");
buffer.get(bytes,2,2);
System.out.println(new String(bytes,2,2));
System.out.println("输出结果");
System.out.println(buffer.position());
}
结果:
ab
2
----------------
cd
输出结果
2
上面例子,如果将reset去掉,获取到的positiion值应该是你最近一次取值的值, buffer.get(bytes,2,2),为4.