51工具盒子

依楼听风雨
笑看云卷云舒,淡观潮起潮落

温故知新!Java NIO总结: ByteBuffer缓存

引言

Java NIO是提供了处理输入/输出操作的非阻塞I/O模型,允许程序在一个线程中管理多个I/O操作,提高了系统的并发能力。Java NIO中,ByteBuffer类是重要的组成,用于处理字节数据,提供了高效、灵活的字节数据处理方式。

一、ByteBuffer类概述

ByteBuffer是Java NIO包中的字节缓冲类,它实现了Buffer接口,是处理字节数据的基础类。ByteBuffer类提供了多种方法,用于读取和写入字节数据,以及管理缓冲区的状态。ByteBuffer类支持多种数据类型,包括字节、字符、短整型、整型、长整型、浮点型和双精度浮点型等。

ByteBuffer内部使用一个字节数组(byte[])来存储数据,通过操作数组中的索引位置来实现数据的读写。ByteBuffer类提供了多种方法,用于读取和写入字节数据,以及管理缓冲区的状态。

二、ByteBuffer的属性

2.1 Capacity

概念:表示Buffer的最大容量,即在创建Buffer时分配的内存空间大小。它是Buffer的根本限制,不能被修改。

作用:Capacity定义了Buffer可以容纳的最大数据量,它决定了Buffer的底层数组的大小。

2.2 Limit

定义:Limit是Buffer中第一个不应该被读取或写入的元素的索引。

影响:Limit限制了Buffer中可读或可写的元素的范围。在写模式(put操作)下,limit是写入数据的结束位置;在读模式(get操作)下,limit是读取数据的结束位置。

2.3 Position

角色:Position表示下一个应该被读取或写入的元素的索引。

读写操作:在写模式(put操作)下,position会随着数据的写入而自动增加;在读模式(get操作)下,position会随着数据的读取而自动增加。

2.4 Mark

设定:Mark是用于标记position当前位置的一个指针。可以通过调用mark()方法来设定。

复位:如果需要回到之前标记的位置,可以调用reset()方法。reset()方法会将position设置为mark所标记的位置。

2.5 使用

使用ByteBuffer展示Capacity、Limit和Position的变化: * * * * *

import java.nio.ByteBuffer;
public class ByteBufferDemo {    public static void main(String[] args) {        // 创建一个初始容量为10的ByteBuffer        ByteBuffer buffer = ByteBuffer.allocate(10);
        // 输出初始值        System.out.println("Initial values:");        System.out.println("Capacity: " + buffer.capacity());        System.out.println("Limit: " + buffer.limit());        System.out.println("Position: " + buffer.position());
        // 写入数据        for (int i = 0; i < 5; i++) {            buffer.put((byte) i);        }
        // 输出写入数据后的值        System.out.println("After writing data:");        System.out.println("Capacity: " + buffer.capacity());        System.out.println("Limit: " + buffer.limit());        System.out.println("Position: " + buffer.position());
        // 切换到读模式        buffer.flip();
        // 输出切换模式后的值        System.out.println("After flipping:");        System.out.println("Capacity: " + buffer.capacity());        System.out.println("Limit: " + buffer.limit());        System.out.println("Position: " + buffer.position());
        // 读取数据        while (buffer.hasRemaining()) {            System.out.print((char) buffer.get() + " ");        }
        // 输出读取数据后的值        System.out.println("After reading data:");        System.out.println("Capacity: " + buffer.capacity());        System.out.println("Limit: " + buffer.limit());        System.out.println("Position: " + buffer.position());    }}

创建一个初始容量为10的ByteBuffer,并写入5个字节的数据。在写入数据后,调用flip()方法切换到读模式,并读取之前写入的5个字节

三、基本操作

  1. 分配空间 :通过ByteBuffer.allocate(int capacity)方法分配指定容量的ByteBuffer。

  2. 包装现有数组 :通过ByteBuffer.wrap(byte[] array)方法使用指定的字节数组创建ByteBuffer。

  3. 读取和写入数据 :使用put(byte b)方法向缓冲区中写入数据,使用get()方法从缓冲区中读取数据。

  4. 翻转 :通过flip()方法将缓冲区从写模式切换到读模式。

  5. 清除 :通过clear()方法清空缓冲区,准备再次写入数据。

  6. 压缩 :通过compact()方法将未读取的数据压缩到缓冲区的起始位置。

四、ByteBuffer的用法

使用ByteBuffer读取和写入数据的基本代码: * * * * *

import java.nio.ByteBuffer;
public class ByteBufferDemo {    public static void main(String[] args) {        // 分配一个容量为10的ByteBuffer        ByteBuffer buffer = ByteBuffer.allocate(10);
        // 写入数据        buffer.put((byte)'a');        buffer.put((byte)'b');        buffer.put((byte)'c');
        // 切换为读模式        buffer.flip();
        // 读取数据        while (buffer.hasRemaining()) {            System.out.print((char) buffer.get());        }
        // 清空缓冲区        buffer.clear();    }}

首先分配了一个容量为10的ByteBuffer,然后向缓冲区中写入了3个字节的数据('a','b','c')。然后,通过调用flip()方法将缓冲区从写模式切换到读模式,并使用get()方法读取缓冲区中的数据。最后,通过调用clear()方法清空缓冲区,准备再次写入数据。

总结

ByteBuffer类是Java NIO中处理字节数据的重要工具,提供高效、灵活的字节数据处理方式。通过ByteBuffer类,我们可以进行数据的读取和写入操作,管理缓冲区的状态,以及处理不同类型的字节数据。

赞(4)
未经允许不得转载:工具盒子 » 温故知新!Java NIO总结: ByteBuffer缓存