ByteBuffer详解

ByteBuffer是在nio中常用的一个buffer,可以理解为就是一个byte的数组,用于存放数据的同时增加了一些属性对这个byte数组进行一些管理

重要属性

属性说明
byte[] hb存数据的字节数组
int mark临时记录position,与mark()、reset()两个方法配合使用
int positionhb数组的当前指针
int limit写模式:可写的字节限制;读模式:可以读的字节限制
int capacitybuffer的大小
int offset和position类似,也是指向hb的指针,当不一定相等

创建方法

一般是用下方四个静态方法来创建

方法说明
allocate(int capacity)

capacity指定了属性limit和capacity的大小,也就是说创建后就是一个写模式,可开始往里写数据

limit=capacity

this.capacity=capacity

allocateDirect(int capacity)和allocate一样的效果,不同的是allocate分配的堆内存,而此方法分配的堆外内存
wrap(byte[] array,int offset, int length)

分配空间同时给数组赋初始值

hb=array

position=offset

limit=offset+length
capacity=length

wrap(byte[] array)调用wrap(array, 0, array.length)

查询属性方法

方法说明
position()返回position
limit()返回limit
capacity()返回capacity
hasRemaining()

一般用于读模式,用while循环判断是都读到了数组尽头

return position < limit;

remaining()

功能和hasRemaining()类似,>0有数据可读,<0数据已读完

return limit - position;

存取方法

加粗的为常用方法

方法说明
put(byte[] src, int offset, int length)

把src里offset到结尾的数据放入hb

关键代码如下:

int end = offset + length;

for (int i = offset; i < end; i++)
        this.put(src[i]);

put(byte[] src)调用put(src, 0, src.length)
put(ByteBuffer src)

配合flip()方法使用,切换到读模式,把所有内容放入hb

int n = src.remaining();
for (int i = 0; i < n; i++)
    put(src.get());

get(byte[] dst, int offset, int length)去hb数据放到dst中
get(byte[] dst)调方法get(dst, 0, dst.length)
byte[] array()直接返回hb

指针移动方法

方法说明
flip()

切换为读模式

limit = position;
position = 0;

clear()

切换为写模式

position = 0;

limit = capacity;

hasRemaining()

return position < limit;

一般用于读模式,用while循环判断是都读到了数组尽头

mark()

记录当前position

mark = position;

reset()

positon切换为mark记录的指针。

使用前必须调用过mark()方法,不然会排除异常

position = mark;

rewind()

position归0,可进行重读或重写

position = 0;

position(int newPosition)

赋值新的position

position = newPosition

limit(int newLimit)

赋值新的limit

limit = newLimit;
if (position > limit) position = limit;

使用示例

创建buffer->写数据到buffer->读出buffer数据传给channel

public class FileChannelTest {

    public static void main(String[] args) throws IOException {
        //append默认false,当传入true时会每次追加内容再最后,false即代表覆盖
        FileOutputStream fileOutputStream = new FileOutputStream("D:\\workspace\\learn\\free\\src\\main\\resources\\fc.txt", false);
        FileChannel channel = fileOutputStream.getChannel();
        ByteBuffer buffer = ByteBuffer.allocate(1024);
        //写模式,写入内容到buffer
        buffer.put("Hello ByteBuffer".getBytes());
        //切换读模式,读出buffer数据传给channel,channel通道连接着文件
        buffer.flip();
        while (buffer.hasRemaining()){
            //write方法调用时,会修改buffer的position一直往后指
            channel.write(buffer);
        }
        //变回初始状态
        buffer.clear();
        channel.close();
    }
}

mark、reset方法使用示例

public class ByteBufferMarkTest {
    public static void main(String[] args) throws IOException {
        ByteBuffer buffer = ByteBuffer.allocate(1024);
        buffer.put("abc".getBytes());
        //在c的位置做标记
        buffer.mark();
        buffer.put("123".getBytes());
        //标记回到c
        buffer.reset();
        buffer.put("456".getBytes());
        buffer.flip();

        byte[] dst = new byte[buffer.remaining()];
        buffer.get(dst);
        //输出abc456,把123的值覆盖了
        System.out.println(new String(dst));
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ByteBufferJava 中用于处理二进制数据的缓冲区类,它可以在缓冲区中存储不同类型的数据,如 byte、short、int、long、float、double 等。使用 ByteBuffer 可以方便地进行数据的读取和写入,并且可以设置字节序(Byte Order)来保证数据在不同机器上的正确性。 ByteBuffer 的常用方法包括: 1. allocate(int capacity):分配一个容量为 capacity 的 ByteBuffer。 2. put(byte[] src):将一个字节数组写入到 ByteBuffer 中。 3. get(byte[] dest):将 ByteBuffer 中的数据读取到一个字节数组中。 4. flip():将读写模式切换,将 limit 设置为当前位置,将 position 设置为 0。 5. rewind():将 position 设置为 0,使得数据可以重新读取。 6. clear():清空 ByteBuffer,将 position 设置为 0,将 limit 设置为 capacity。 例如,下面是一个使用 ByteBuffer 写入和读取数据的示例代码: ```java // 创建一个容量为 10 的 ByteBuffer ByteBuffer buffer = ByteBuffer.allocate(10); // 写入数据 buffer.putInt(123); buffer.putDouble(3.14); buffer.putChar('A'); // 切换到读模式 buffer.flip(); // 读取数据 int intValue = buffer.getInt(); double doubleValue = buffer.getDouble(); char charValue = buffer.getChar(); System.out.println(intValue); // 输出 123 System.out.println(doubleValue); // 输出 3.14 System.out.println(charValue); // 输出 A ``` 需要注意的是,ByteBuffer 中的 position、limit 和 capacity 属性的含义如下: 1. position:当前读写位置。 2. limit:缓冲区的限制,即当前可以读写的最大位置。 3. capacity:缓冲区的容量,即最多可以存储多少字节数据。 在写入数据时,position 会自动向前移动,而 limit 和 capacity 不会变化;在读取数据时,position 和 limit 会随着读取的数据量自动向前移动。如果需要重新读取数据,可以使用 rewind() 方法将 position 设置为 0,如果需要清空缓冲区,可以使用 clear() 方法将 position 设置为 0,limit 设置为 capacity。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值