Java NIO中Buffer方法详解(含代码示例)

news/2024/11/29 20:34:29/

目录

概念及方法

容量(Capacity):

位置(Position):

上界(Limit):

标记(Mark):

清空(Clear):

翻转(Flip):

压缩(Compact):

Buffer中几个量的关系

使用Buffer时候的注意事项

确保正确设置位置(Position)、上界(Limit)和容量(Capacity):

注意数据类型匹配:

注意缓冲区的状态切换:

避免访问越界:

及时释放缓冲区:


Java NIO(New IO)中的Buffer类是一个抽象类,用于在Java程序中进行数据的读取和写入操作。它提供了一组方法来操作底层数据容器,例如数组或ByteBuffer。下面是对Buffer类中常用方法的详细解释和代码示例。

概念及方法

容量(Capacity):

  • 容量是Buffer对象中可以存储的最大数据量。可以通过capacity()方法获取容量。
  • 示例:
  • 使用allocate(int capacity)方法创建了一个容量为1024的ByteBuffer对象。
  • 容量表示Buffer对象中可以存储的最大数据量。
  • 可以使用capacity()方法获取Buffer对象的容量。
ByteBuffer buffer = ByteBuffer.allocate(1024);
int capacity = buffer.capacity();
System.out.println("Capacity: " + capacity);

位置(Position):

  • 位置表示下一个要读取或写入的元素索引。初始位置为0,每读取或写入一个元素,位置都会自动增加。
  • 可以通过position()方法获取当前位置,或使用position(int newPosition)方法设置新的位置。
  • 初始位置为0,每次读取或写入一个元素后,位置会自动增加。
  • 示例:
ByteBuffer buffer = ByteBuffer.allocate(1024);
int position = buffer.position();
System.out.println("Position: " + position);buffer.position(10);

上界(Limit):

  • 上界表示Buffer中可以访问的元素的最大索引。初始上界等于容量,可以通过limit()方法获取当前上界,或使用limit(int newLimit)方法设置新的上界。
  • 示例:
ByteBuffer buffer = ByteBuffer.allocate(1024);
int limit = buffer.limit();
System.out.println("Limit: " + limit);buffer.limit(100);

标记(Mark):

  • 标记是一个备忘位置,可以通过mark()方法设置标记,并通过reset()方法将位置重置为标记的位置。
  • 示例:
ByteBuffer buffer = ByteBuffer.allocate(1024);
buffer.mark();// 执行读写操作...buffer.reset();

清空(Clear):

  • clear()方法将位置重置为0,上界设置为容量,清空缓冲区,但数据仍然存在,只是处于被遗忘状态。
  • 示例:
ByteBuffer buffer = ByteBuffer.allocate(1024);
buffer.clear();

翻转(Flip):

  • flip()方法将上界设置为当前位置,位置重置为0,用于将Buffer从写模式切换到读模式。
  • 示例:
ByteBuffer buffer = ByteBuffer.allocate(1024);// 执行写入操作...buffer.flip();

压缩(Compact):

  • compact()方法将未读的数据复制到缓冲区的起始位置,位置设置为复制数据的最后一个元素的下一个位置,上界设置为容量。
  • 示例:
ByteBuffer buffer = ByteBuffer.allocate(1024);// 执行读取操作...buffer.compact();

Buffer中几个量的关系

在Java NIO(New IO)中的Buffer类中,有几种重要的量需要理解,它们是容量(Capacity)、位置(Position)、上界(Limit)和标记(Mark)。这些量之间存在一定的关系,下面是它们之间的详细解释和关系说明:

  1. 容量(Capacity):

    • 容量是指Buffer对象中可以存储的最大数据量,它在创建Buffer时被设置,并且在整个Buffer的生命周期中保持不变。
    • 容量可以通过capacity()方法获取。
    • 容量决定了Buffer对象能够存储多少个元素(字节或字符)。
  2. 位置(Position):

    • 位置表示下一个要读取或写入的元素索引,它初始值为0,并且随着读取和写入操作的进行而自动增加。
    • 位置可以通过position()方法获取,也可以使用position(int newPosition)方法设置新的位置。
    • 位置始终位于0到上界之间,表示当前读取或写入的位置。
  3. 上界(Limit):

    • 上界表示Buffer中可以访问的元素的最大索引(非实际容量),它初始值等于容量,并且可以通过limit()方法获取。
    • 上界可以使用limit(int newLimit)方法进行设置。
    • 上界决定了可以读取或写入的元素的数量。
  4. 标记(Mark):

    • 标记是一个备忘位置,可以使用mark()方法设置,并且可以使用reset()方法将位置重置为标记的位置。
    • 标记并不影响位置、上界或容量的值,它仅仅是一个用于备忘位置的标记。

这些量之间的关系如下:

  • 初始状态下,位置和上界都为0,标记未定义。
  • 写入数据时,位置逐渐增加,上界保持不变,标记未定义。
  • 调用flip()方法切换到读模式时,位置被设置为0,上界设置为之前的位置,标记未定义。
  • 读取数据时,位置逐渐增加,上界保持不变,标记未定义。
  • 调用clear()compact()方法切换到写模式时,位置被设置为上一次读取的位置,上界设置为容量,标记未定义。

在操作Buffer时,需要注意保持位置、上界和标记的合理设置,以确保正确读取和写入数据。

使用Buffer时候的注意事项

确保正确设置位置(Position)、上界(Limit)和容量(Capacity):

  • 在进行读取或写入操作之前,确保正确设置位置和上界,以及缓冲区的容量。
  • 示例:
    ByteBuffer buffer = ByteBuffer.allocate(1024); 
    buffer.position(0); 
    uffer.limit(512);

注意数据类型匹配:

  • Buffer类有不同的子类,如ByteBuffer、CharBuffer、IntBuffer等,每个子类都有特定的数据类型。
  • 在读取或写入数据时,确保使用正确的数据类型匹配缓冲区的类型。
  • 示例:
    IntBuffer intBuffer = IntBuffer.allocate(10); 
    intBuffer.put(100);

注意缓冲区的状态切换:

  • 在读取和写入之间切换缓冲区的状态时,要确保正确设置位置、上界和标记。
  • 使用flip()方法从写模式切换到读模式,使用clear()compact()方法从读模式切换到写模式。
  • 示例:
    ByteBuffer buffer = ByteBuffer.allocate(1024); // 写入数据 
    buffer.put((byte) 1); 
    buffer.put((byte) 2); 
    buffer.put((byte) 3); // 切换到读模式 
    buffer.flip(); // 读取数据 
    while (buffer.hasRemaining()){ 
    byte data = buffer.get(); // 处理数据 
    } 
    // 切换到写模式 buffer.clear();

避免访问越界:

  • 在读取和写入数据时,要确保不要超过缓冲区的有效范围,即上界。
  • 使用limit()方法设置上界,并在读取和写入操作时进行合适的判断。
  • 示例: 

    ByteBuffer buffer = ByteBuffer.allocate(1024);
    buffer.limit(512);// 写入数据
    for (int i = 0; i < buffer.limit(); i++) {buffer.put((byte) i);
    }// 读取数据
    buffer.flip();
    while (buffer.hasRemaining()) {byte data = buffer.get();// 处理数据
    }
    

及时释放缓冲区:

  • 在不再使用缓冲区时,要及时释放资源,避免内存泄漏。
  • 使用clear()方法或compact()方法重置缓冲区的状态,并释放资源。
  • 示例:
ByteBuffer buffer = ByteBuffer.allocate(1024);// 使用缓冲区...// 释放缓冲区
buffer.clear();


http://www.ppmy.cn/news/497377.html

相关文章

C# 特性(Attribute)总结

目录 特性是什么&#xff1f; 如何使用特性&#xff1f; &#xff08;1&#xff09;.Net 框架预定义特性 &#xff08;2&#xff09;自定义特性 为什么要使用特性&#xff1f; 特性的应用 特性实现枚举展示描述信息 特性是什么&#xff1f; 特性&#xff08;Attribute&…

超好看的UI云开发壁纸小程序源码

正文: 本壁纸表情包头像小程序采用&#xff08;dcloud云开发&#xff09;所以无需服务器与域名&#xff0c;本次版本集合了前两个版本所有的功能并有以下的更新。 更改界面UI样式&#xff0c;修复了路径控制BUG。新增任务中心、首页栏目增加动态壁纸搜索(支持关键词搜索全网动…

导向滤波 Guided Filter 的 CUDA GPU版本

Guided Filter Using CUDA GitHub Repo : Plumess/Guided-Filter-Using-CUDA: A GPU version implementation of Guided Filter, using CUDA C/C, calculates 1080P images in 10ms on 4090 (github.com) 这是导向滤波/引导滤波的一种GPU实现&#xff0c;经测试&#xff0c;在…

有没有关于python的壁纸_初学Python——01(想要好看的壁纸吗?)

#把win10锁屏页面的图片批量导出图片到E&#xff1a;\win10壁纸 import os import shutil pathrC:\Users\Administrator\AppData\Local\Packages\Microsoft.Windows.ContentDeliveryManager_cw5n1h2txyewy\LocalState\Assets to_pathrE:\Win10壁纸 #创建文件夹 isExistso…

vue 常见问题处理

当使用Vue.js开发应用程序时&#xff0c;可能会遇到一些常见问题。以下是一些常见的Vue.js问题及其解决方法的集锦&#xff1a; Vue组件无法正常显示或渲染&#xff1a; 确保Vue组件被正确导入和注册。 检查模板语法是否正确&#xff0c;包括HTML标记、属性和指令的使用。 使…

【AUTOSAR】AUTOSAR开发工具链(二)----TASKING库的封装

1、集成工程 步骤&#xff1a; 拷贝模块代码&#xff1a; 将源工程的所有模块代码拷贝到库工程&#xff0c;将源工程拷贝一份&#xff0c;并删除不必要的文件作为释放工程&#xff0c;完成结果如下图&#xff1a; 源工程&#xff08;左&#xff09;VS库工程&#xff08;中&am…

<C++> C++11右值引用

C11右值引用 1.左值引用和右值引用 传统的C语法中就有引用的语法&#xff0c;而C11中新增了的右值引用语法特性&#xff0c;所以从现在开始我们之前学习的引用就叫做左值引用。无论左值引用还是右值引用&#xff0c;都是给对象取别名。 什么是左值&#xff1f;什么是左值引用…