Buffer简介与使用

  •  Buffer介绍

Buffer实际上是一块内存区域,由java.nio.Buffer封装起来,提供读写的接口。Buffer的实现类有以下几种,包括了基本的数据类型:ByteBuffer,CharBuffer,ShortBuffer,IntBuffer,FloatBuffer,DoubleBuffer,LongBuffer。

  • Buffer字段
  1. Capacity:  Buffer创建时分配内存大小,(通过ByteBuffer.allocate(int Capacity)分配),放置写入的数据,这一容量在缓冲区创建时被设定,并且永远不能被改变。
  2. Limit:缓冲区的第一个不能被读或写的元素。缓冲创建时,limit 的值等于 capacity 的值。
  3. Position:下一个要被读或写的元素的索引。位置会自动由相应的 get() 和 put() 函数更新。
  4. 标记(Mark):一个备忘位置,用来临时标记一下当前position。例子:如果当前position是2,我们需要在位置5写或读取数据,那么,你需要调用mark(),然后调用position(5)跳到你需要的位置,处理完后,调用reset()把position置回mark的位置,即2。

在正常情况下:mark <= position <= limit <= capacity。

限制你不能通过reset()把position的位置往前调,否则会报错。

  • Buffer方法

position(int newPosition)

设置position位置,newPosition <= limit。如果当前mark的位置大于newPosition,则mark置为-1,此时无法reset()。

limit(int newLimit)

设置limit值。

mark()

令mark = position,对当前position作标记。

reset()

在调用mark之后调用Buffer.reset()方法恢复到这个position。调用成功前提是mark <= 当前position

flip()

把Buffer从写模式切换到读模式。把position归零,并设置limit为之前的position的值。 此时你可从position位置开始读0-limit这一段的数据。

rewind()

将position置为0,重复读取buffer中数据。limit保持不变(此时mark也会变为-1)。

clear()

position将被设回0,limit被设置成 capacity的值,相当于切换成从0开始的写模式,

compact()

与clear()不同的是,如果Buffer还有一些数据没有读取完(即读模式下的position<limit),会把这些未读完的数据放在buffer开头,令position的值为未读完数据之后。

  • 用例
import java.nio.ByteBuffer;

public class Main {

    public static void main(String[] args) {
        ByteBuffer buffer = ByteBuffer.allocate(30);
        System.out.println("capacity:" + buffer.capacity());
        buffer.put("123456789".getBytes());
        System.out.println("当前buffer状态:\n          " + buffer);
        System.out.println("当前buffer数据:\n          " + new String(buffer.array()));
        buffer.flip();
        System.out.println("flip(切换为读模式):\n          " + buffer);
        System.out.print("读取三个单位:\n          ");
        System.out.print((char) buffer.get());
        System.out.print((char) buffer.get());
        System.out.println((char) buffer.get());
        System.out.println("读取三个单位后buffer状态:\n          " + buffer);
        buffer.compact();
        //因为刚才还有6个单位没有读完,compact会把它们复制到前,把position置为6
        System.out.println("compact后buffer状态:\n          " + buffer);
        System.out.println("compact后buffer数据:\n          " + new String(buffer.array()));
        buffer.put("123".getBytes());
        System.out.println("往buffer写3个单位(从compact后的position位置):\n          " + new String(buffer.array()));
    }
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值