代码:
FileInputStream fileInputStream = new FileInputStream("test1.txt");
FileChannel channel = fileInputStream.getChannel();
ByteBuffer byteBuffer = ByteBuffer.allocate(20);
System.out.println("--------初始化完成--------------");
System.out.println("capacity:" + byteBuffer.capacity());
System.out.println("limit:" + byteBuffer.limit());
System.out.println("position:" + byteBuffer.position());
channel.read(byteBuffer);
System.out.println("--------第一次读取数据完成后值--------------");
System.out.println("capacity:" + byteBuffer.capacity());
System.out.println("limit:" + byteBuffer.limit());
System.out.println("position:" + byteBuffer.position());
byteBuffer.flip();
System.out.println("--------第一次读取数据后,第一次flip()后值--------------");
System.out.println("capacity:" + byteBuffer.capacity());
System.out.println("limit:" + byteBuffer.limit());
System.out.println("position:" + byteBuffer.position());
while (byteBuffer.remaining() > 0){
System.out.println(byteBuffer.get());
}
byteBuffer.flip();
System.out.println("--------第一次读取数据后,第二次flip()后值--------------");
System.out.println("capacity:" + byteBuffer.capacity());
System.out.println("limit:" + byteBuffer.limit());
System.out.println("position:" + byteBuffer.position());
FileInputStream fileInputStream1 = new FileInputStream("test2.txt");
FileChannel channel1 = fileInputStream1.getChannel();
channel1.read(byteBuffer);
System.out.println("--------第二次读取数据后值--------------");
System.out.println("capacity:" + byteBuffer.capacity());
System.out.println("limit:" + byteBuffer.limit());
System.out.println("position:" + byteBuffer.position());
byteBuffer.flip();
System.out.println("--------第二次读取数据后,第一次flip()后值--------------");
System.out.println("capacity:" + byteBuffer.capacity());
System.out.println("limit:" + byteBuffer.limit());
System.out.println("position:" + byteBuffer.position());
while (byteBuffer.remaining() > 0){
System.out.println(byteBuffer.get());
}
byteBuffer.flip();
System.out.println("--------第二次读取数据后,flip()后值--------------");
System.out.println("capacity:" + byteBuffer.capacity());
System.out.println("limit:" + byteBuffer.limit());
System.out.println("position:" + byteBuffer.position());
byteBuffer.clear();
System.out.println("--------clear()后值--------------");
System.out.println("capacity:" + byteBuffer.capacity());
System.out.println("limit:" + byteBuffer.limit());
System.out.println("position:" + byteBuffer.position());
输出:
--------初始化完成--------------
capacity:20
limit:20
position:0
--------第一次读取数据完成后值--------------
capacity:20
limit:20
position:8
--------第一次读取数据后,第一次flip()后值--------------
capacity:20
limit:8
position:0
97
98
99
100
101
102
103
104
--------第一次读取数据后,第二次flip()后值--------------
capacity:20
limit:8
position:0
--------第二次读取数据后值--------------
capacity:20
limit:8
position:8
--------第二次读取数据后,第一次flip()后值--------------
capacity:20
limit:8
position:0
122
121
120
104
103
102
101
100
--------第二次读取数据后,flip()后值--------------
capacity:20
limit:8
position:0
--------clear()后值--------------
capacity:20
limit:20
position:0
public final Buffer flip() {
limit = position;
position = 0;
mark = -1;
return this;
}
public final Buffer clear() {
position = 0;
limit = capacity;
mark = -1;
return this;
}
总结:
capacity:指定后大小不会变化
position: 根据读取的数据长度变化,第一次读取后,长度为数据长度(8),flip()后,长度变为0 ,从0开始写出数据,第二次读取数据,则不能完成读取,只能读取与第一次数据长度相同的数据(8,实际第二次的数据长度为11)
limit:初始化长度与capacity相同,第一次读取数据,flip() 执行limit = position, 写出数据后,第二次读取数据,limit限制了读取数据的长度
如果需要第二次完整读取数据,需要clear将所有属性重置