Java中nio的bytebuffer常用方法解读

1.Bytebuffer介绍

在Java中,ByteBuffer是Java NIO(New Input/Output)库中的一个重要类,主要用于高效地处理原始字节数据。它是 java.nio.Buffer 抽象类的一个子类,专门设计用来读写字节流,尤其是在进行文件I/O操作、网络通信、数据打包与解包等场景中非常有用。

2.ByteBuffer的几个关键属性

        容量(Capacity): ByteBuffer 具有一个固定的容量,即可以存储的最大字节数。这个容量在创建时确定,并且之后不可改变。通过 ByteBuffer.allocate(int capacity) 方法可以在Java堆内存中分配指定容量的 ByteBuffer。通过 ByteBuffer.allocateDirect(int capacity) 方法则可以在Java堆外内存(直接内存)中分配一个 ByteBuffer,适合处理大量数据且需要减少内存复制开销的情况。
        限制(Limit): 表示当前缓冲区中实际有效的数据结束位置。即最多只能读取到限制位置的数据,或者最多只能写入到限制位置。

        位置(Position): 表示下一个将要被读取或写入的字节的位置。每次调用读写方法(如 get() 或 put())后,位置都会自动前进到下一个待操作的字节处。

        标记(Mark)与重置(Reset): 可以通过 mark() 方法设定一个标记点,然后通过 reset() 方法回到这个标记点,方便进行多次读写循环。

        翻转(Flip): 使用 flip() 方法可以将缓冲区从写模式切换到读模式,同时将限制设置为当前位置,并将当前位置归零,准备开始读取刚刚写入的数据。

        清除(Clear)与填充(Rewind): clear() 方法将缓冲区清空为初始状态,即位置设为0,限制设为容量;而 rewind() 方法将位置重置为0,但保留原有限制,允许从头开始再次读写。

3.多种方法使用

      1.数据结构

       ByteBuffer创建可以使用allocate或者warp直接创建。allocate创建指定容量的buffer,warp创建一个指定内容的buffer

position是当前指针,读写都是使用这个指针

2.put操作

        每次执行put操作后,将当前位置设置值,然后position指针向后移动若干个位置。比如char类型是2个字节,会占用2个byte,position会移动2

3.flip操作

        由于读和写都是在当前position位置操作,在写操作结束后要进行重头读取需要调用flip操作,

将position指针置为0,limit设置为当前在执行读取操作

public final Buffer flip() {
    limit = position;
    position = 0;
    mark = -1;
    return this;
}

4.get操作

读取操作将当前位置取出,然后将position指针进行移动,position无法超高limit

        

5.mark操作

mark操作将mark指针放置在position位置,用来记录上次位置

    public final Buffer mark() {
        mark = position;
        return this;
    }

6.reset方法

将position移动到mark位置,可以重新对当前位置进行操作。如果执行之前没有调用mark()方法或后续操作(position(int)如果指定位置小于mark位)将mark重置回-1,则抛出异常

   public final Buffer reset() {
        int m = mark;
        if (m < 0)
            throw new InvalidMarkException();
        position = m;
        return this;
   }

7.position方法

将position指针移动到指定位置,并将之前保存的mark指针移动到-1位置

    public final Buffer position(int newPosition) {
        if ((newPosition > limit) || (newPosition < 0))
            throw new IllegalArgumentException();
        if (mark > newPosition) mark = -1;
        position = newPosition;
        return this;
    }

8.slice方法

        slice会创建一个新的byteByffer对象。不过能操作的空间不同,新对象指向原来地址空间的position到limit区间,每次修改数据,原来的byteBuffer也会修改

  • 30
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值