Java NIO之缓冲区Buffer分析

目录

Buffer介绍

ByteBuffer介绍

ByteBuffer案例

总结


Buffer介绍

1.Buffer简介

      缓冲区(Buffer)是中NIO中基础的内容,存在于包java.nio下面.一个Buffer对象可以看做是一个存储数据的容器,数据被存储到这里后可以进行检索。缓冲区工作与通道关联,我们不与通道直接进行交互,而是通过缓冲区将数据传送到通道里,或者从通道获取数据放到缓冲区。Buffer类是一个顶层的抽象类,里面定义了缓冲区操作的基本方法。Buffer的子类包含了java基本类型中除布尔类型以外的其他基本数据类型对应缓冲区。需要注意的是数据传输的基本单位是字节,所以唯一与通道交互的缓冲区是ByteBuffer,存储的是原始的字节数据,而其他的缓冲区提供了用java基本数据类型来查看ByteBuffer中字节数据的视图,比如调用asCharBuffer(),就是将字节转换成字符查看ByteBuffer里面的数据,实际存储数据的真正地方依旧是ByteBuffer缓冲区。

      ByteBuffer是原始字节存储的地方,如要将字节进行正确转换成字符数据,需要将字节数据先进行特定编码转成字符输入到字符缓冲区,或者在输出的时候将数据按指定字符集进行解码处理,否则会出现乱码的情况。

java.nio包下面包含java基本类型中除boolean类型的缓冲区有ByteBuffer,ShortBuffer,IntBuffer,LongBuffer,FloatBuffer,CharBuffer

DoubleBuffer,此外还有MappedByteBuffer(继承自ByteBuffer),还有不能直接访问的HeapByteBuffer,DirectByteBuffer。其中HeapByteBuffer是调用ByteBuffer中allocate()时底层的实现,分配空间是受JVM管控的堆内存。而DirectByteBuffer是ByteBuffer.allocateDirect()方法时底层实现,分配的空间是虚拟机之外的内存。Buffer的子类子类如下:

                 

基本数据类型  缓冲区
byte ByteBuffer
short ShortBuffer
int IntBuffer
long LongBuffer
boolean -
char  CharBuffer
float FloatBuffer
double DoubleBuffer
- MappedByteBuffer
- HeapByteBuffer(底层实现,无法直接访问,JVM堆内存)
- DirectByteBuffer(底层实现,无法直接访问,JVM外的内存)

2.内部变量

private int mark = -1;
private int position = 0;
private int limit;
private int capacity;
long address;
  • mark----调用mark()方法将会当前位置postion保存,-1表示的是当前没有标记。
  • position----下一个要写入或者读取元素的索引位置,position值不会为负数,并且不会大于limit的值。
  • limit----第一个不能写入或者读取的元素的索引位置,limit值不会为负数,并且不会大于capacity的值。
  • capacity----缓冲区的容量,capacity值不会为负数,并且不能被改变。

所以Buffer变量内部变量满足:0 <= mark<=position <= limit <= capacity.

2.内部方法

public final int capacity() {}
public final int position() {}
public final Buffer position(int newPosition) {}
public final int limit() {}
public final Buffer limit(int newLimit) {}
public final Buffer mark() {}
public final Buffer reset() {}
public final Buffer clear() {}
public final Buffer flip() {}
public final Buffer rewind() {}
public final int remaining() {}
public final boolean hasRemaining() {}
public abstract boolean isReadOnly()
public abstract boolean hasArray();
public abstract Object array();
public abstract int arrayOffset();
public abstract boolean isDirect()
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值