NIO的缓冲区原理
程序员文章站
2022-06-28 18:41:21
NIO的缓冲区 Buffer平时项目中很少用到NIO,时间久了也就忘记,写这篇博客仅仅是方便以后的复习。java的IO是面向流的,而现在NIO(Java New I/O(NIO))是面向缓冲区的,简单学习一下java.nio包下的Bufferposition:下一个要被读或写的元素的索引,默认为0capacity:容量,缓冲区能够容纳的数据元素的最大数量limit:上界,缓冲区的第一个不能被读或写的元素mark:标记,一个备忘位置,默认位置为-1Buffer类的常见方法ByteBu...
NIO的缓冲区 Buffer
平时项目中很少用到NIO,时间久了也就忘记,写这篇博客仅仅是方便以后的复习。
java的IO是面向流的,而现在NIO(Java New I/O(NIO))是面向缓冲区的,简单学习一下java.nio包下的Buffer
position:下一个要被读或写的元素的索引,默认为0
capacity:容量,缓冲区能够容纳的数据元素的最大数量
limit:上界,缓冲区的第一个不能被读或写的元素
mark:标记,一个备忘位置,默认位置为-1
Buffer类的常见方法
ByteBuffer常见方法:
//创建一个新的缓冲区
ByteBuffer buffer = ByteBuffer.allocate(10);
再来看看allocate()方法
public static ByteBuffer allocate(int capacity) {
if (capacity < 0)
throw new IllegalArgumentException();
//返回容量和limit是capacity的ByteBuffer
return new HeapByteBuffer(capacity, capacity);
}
这个方法很简单的,静态的,如果容量小于0,就抛出异常,否则返回 HeapByteBuffer,再来看看 HeapByteBuffer
//一个内部类,继承ByteBuffer
class HeapByteBuffer
extends ByteBuffer
{
// For speed these fields are actually declared in X-Buffer;
// these declarations are here as documentation
/*
protected final byte[] hb;
protected final int offset;
*/
//构造方法
HeapByteBuffer(int cap, int lim) { // package-private
super(-1, 0, lim, cap, new byte[cap], 0);
/*
hb = new byte[cap];
offset = 0;
*/
}
HeapByteBuffer(byte[] buf, int off, int len) { // package-private
super(-1, off, off + len, buf.length, buf, 0);
/*
hb = buf;
offset = 0;
*/
}
//向缓冲区插入数据
buffer.put("hello".getBytes());
执行以下代码
public static void main(String[] args) {
//创建一个新的缓冲区
ByteBuffer buffer = ByteBuffer.allocate(10);
buffer.put("hello".getBytes());
System.out.println(buffer.capacity());
System.out.println(buffer.limit());
System.out.println(buffer.position());
}
输出:
可见该缓冲区的容量是10,limit是10,position是5
位置被设为0,而且容量和上界被设为10,刚好经过缓冲区能够容纳的最后一个字节。标记最初未定义。容量是固定的,但另外的三个属性可以在使用缓冲区时改变。
public static void main(String[] args) {
//创建一个新的缓冲区
ByteBuffer buffer = ByteBuffer.allocate(10);
buffer.put("hello".getBytes());
System.out.println(buffer.capacity());
System.out.println(buffer.limit());
System.out.println(buffer.position());
System.out.println("==============");
//position(2) 设置这个缓冲区的位置。
//mark()将此缓冲区的标记设置在其位置。
System.out.println(buffer.position(2).mark());//此时 position为2,mark也为2
System.out.println(buffer.capacity());
System.out.println(buffer.limit());
System.out.println(buffer.position());
System.out.println("==============");
//将此缓冲区的位置重置为先前标记的位置,此时position=2,之前标记的位置为2
buffer.reset();
System.out.println(buffer.capacity());
System.out.println(buffer.limit());
System.out.println(buffer.position());
System.out.println("==============");
}
public static void main(String[] args) {
//创建一个新的缓冲区
ByteBuffer buffer = ByteBuffer.allocate(10);
buffer.put("hello".getBytes());
System.out.println(buffer.capacity());
System.out.println(buffer.limit());
System.out.println(buffer.position());
System.out.println("==============");
byte b = buffer.get();
byte b1 = buffer.get(0);
System.out.println(b);
System.out.println(b1);
}
可见put之后直接调用get()方法是无法获取的,此时的position位置是5,没有值的
buffer.rewind();//将position设置为最开始位置,limit不变
System.out.println("=============");
System.out.println(buffer.capacity());
System.out.println(buffer.limit());
System.out.println(buffer.position());
byte b2 = buffer.get();
System.out.println(b2);
buffer.flip();//将position设置为最开始位置,limit也变
System.out.println("=============");
System.out.println(buffer.capacity());
System.out.println(buffer.limit());
System.out.println(buffer.position());
byte b2 = buffer.get();
System.out.println(b2);
写到现在可以得出Buffer是个属性直接的关系了
0 <= mark <= position <= limit <= capacity
本文地址:https://blog.csdn.net/weixin_43481793/article/details/107405895