第一百七十三节 Java IO教程 - Java缓冲区读写

news2024/12/24 2:21:41

Java IO教程 - Java缓冲区读写

缓冲区读取

有两种方法从缓冲区读取数据:

  • 绝对位置
  • 相对位置

使用四个版本重载的get()方法用于从缓冲区读取数据。

get(int index)返回给定索引处的数据。

get()从缓冲区中的当前位置返回数据,并将位置增加1。

get(byte [] destination,int offset,int length)从缓冲区中批量读取数据。 它从缓冲区的当前位置读取长度字节数,并将它们放在从指定偏移量开始的指定目标数组中。

get(byte [] destination)通过从缓冲区的当前位置读取数据并且每次读取数据元素时将当前位置递增1来填充指定的目标数组。

缓冲区写入

使用重载五个版本的put()方法将数据写入缓冲区。

put(int index,byte b)将指定的b数据写入指定的索引。 调用此方法不会更改缓冲区的当前位置。

put(byte b)将指定的字节写入缓冲区的当前位置,并将位置递增1。

put(byte [] source,int offset,int length)将起始于偏移量的源数组的字节长度写入从当前位置开始的缓冲区。 如果缓冲区中没有足够的空间来写入所有字节,它会抛出BufferOverflowException。 缓冲区的位置按长度增加。

put(byte [] source)与调用put(byte [] source,0,source.length)相同。

ByteBuffer put(ByteBuffer src)从指定的字节缓冲区src读取剩余的字节,并将它们写入缓冲区。 如果目标缓冲区中的剩余空间小于源缓冲区中的剩余字节,则抛出运行时BufferOverflowException。

以下代码显示如何写入缓冲区和从缓冲区读取。

import java.nio.ByteBuffer;

public class Main {
  public static void main(String[] args) {
    ByteBuffer bb = ByteBuffer.allocate(8);
    printBufferInfo(bb);
    for (int i = 50; i < 58; i++) {
      bb.put((byte) i);
    }
    printBufferInfo(bb);
  }

  public static void printBufferInfo(ByteBuffer bb) {
    int limit = bb.limit();
    System.out.println("Position =  " + bb.position() + ", Limit   = " + limit);
    for (int i = 0; i < limit; i++) {
      System.out.print(bb.get(i) + "  ");
    }
    System.out.println();
  }
}

如果我们可以在缓冲区上使用相对get()或put()方法来读/写至少一个元素,则缓冲区的hasRemaining()方法返回true。

我们可以通过使用相对的get()或put()方法,通过使用其remaining()方法来获得我们可以读/写的最大数量的元素。

上面的代码生成以下结果。

例子

以下代码显示如何使用相对读取和写入之间的缓冲区的flip()和hasRemaining()方法。

import java.nio.ByteBuffer;

public class Main {
  public static void main(String[] args) {
    ByteBuffer bb = ByteBuffer.allocate(8);
    printBufferInfo(bb);

    // Use flip() to reset the position to zero because
    // the printBufferInfo() method uses relative get() method
    bb.flip();

    int i = 50;
    while (bb.hasRemaining()) {
      bb.put((byte) i++);
    }

    // Call flip() again to reset the position to zero,
    // because the above put() call incremented the position
    bb.flip();
    printBufferInfo(bb);
  }

  public static void printBufferInfo(ByteBuffer bb) {
    int limit = bb.limit();
    System.out.println("Position =  " + bb.position() + ", Limit   = " + limit);
    while (bb.hasRemaining()) {
      System.out.print(bb.get() + "  ");
    }
    System.out.println();
  }
}

上面的代码生成以下结果。

只读缓冲区

缓冲区可以是只读的或读写的。 我们只能读取只读缓冲区的内容。

我们可以通过调用特定缓冲区类的asReadOnlyBuffer()方法来获取只读缓冲区。

// Create a  buffer that is read-write by  default
ByteBuffer bb  = ByteBuffer.allocate(1024);
boolean readOnly   = bb.isReadOnly(); // false

要检查缓冲区是否为只读,请按如下所示调用isReadOnly()方法:

ByteBuffer bbReadOnly = bb.asReadOnlyBuffer();
boolean readOnly = bbReadOnly.isReadOnly(); 

asReadOnlyBuffer()方法返回的只读缓冲区是同一个缓冲区的不同视图。 对原始缓冲区的内容的任何修改都反映在只读缓冲区中。

缓冲区视图

我们可以获得缓冲区的不同视图。 缓冲区的视图与原始缓冲区共享数据,并保持其自身的位置,标记和限制。

我们也可以复制一个缓冲区,在这种情况下,它们共享内容,但独立地保持标记,位置和限制。 使用缓冲区的duplicate()方法获取缓冲区的副本如下:

// Create a  buffer
ByteBuffer bb  = ByteBuffer.allocate(1024);

// Create a  duplicate view  of  the   buffer
ByteBuffer bbDuplicate = bb.duplicate();

我们还可以通过使用缓冲区的slice()方法创建其切片视图,从而创建缓冲区的切片视图,如下所示:

// Create a  buffer
ByteBuffer bb  = ByteBuffer.allocate(8);
bb.position(3);
bb.limit(6);
// bbSlice will have  position set to 0  and  its  limit set to 3. 
ByteBuffer bbSlice  = bb.slice();

我们还可以获得用于不同原始数据类型的字节缓冲区的视图。

例如,我们可以获得字节缓冲区的字符视图,浮点视图等。ByteBuffer类包含诸如asCharBuffer(),asLongBuffer(),asFloatBuffer()等方法来获得原始数据类型的视图。

// Create a  byte   buffer
ByteBuffer bb  = ByteBuffer.allocate(8);

// Create a  char   view  of  the   byte   buffer
CharBuffer cb  = bb.asCharBuffer();

// Create a  float view  of  the   byte   buffer
FloatBuffer fb  = bb.asFloatBuffer();

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1936791.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

vmware配置centos+配置静态ip联网+更换镜像

centos7配置参考【实战】VMware17虚拟机以及Centos7详细安装教程-CSDN博客 ip配置步骤&#xff1a; 先更改编辑虚拟网络编辑器中的内容 就按照还原默认设置来&#xff0c;设定后就是以上内容&#xff0c;然后一定要记住子网ip和子网掩码 接下来就是NAT设置&#xff1a; 网关…

Spring Boot集成SFTP快速入门Demo

1.什么是SFTP&#xff1f; SFTP&#xff08;SSH File Transfer Protocol&#xff0c;也称 Secret File Transfer Protocol&#xff09;&#xff0c;是一种基于SSH&#xff08;安全外壳&#xff09;的安全的文件传输协议。使用SFTP协议可以在文件传输过程中提供一种安全的加密算…

ABAP打印WORD的解决方案

客户要求按照固定格式输出到WORD模板中&#xff0c;目前OLE和DOI研究了均不太适合用于这种需求。 cl_docx_document类可以将WORD转化为XML文件&#xff0c;利用替换字符串方法将文档内容进行填充同 时不破坏WORD现有格式。 首先需要将WORD的单元格用各种预定义的字符进行填充…

Redis的AOF持久化策略(AOF的工作流程、AOF的重写流程,操作演示、注意事项等)

文章目录 缓冲AOF 策略(append only file)AOF 的工作流程AOF 缓冲区策略AOF 的重写机制重写完的AOF文件为什么可以变小&#xff1f;AOF 重写流程 缓冲AOF 策略(append only file) AOF 的核心思路是 “实时备份“&#xff0c;只要我添加了新的数据或者更新了新的数据&#xff0…

价格较低,功能最强?OpenAI 推出 GPT-4o mini,一个更小、更便宜的人工智能模型

OpenAI美东时间周四推出“GPT-4o mini”&#xff0c;入局“小而精”AI模型竞争&#xff0c;称这款新模型是“功能最强、成本偏低的模型”&#xff0c;计划今后整合图像、视频、音频到这个模型中。 OpenAI表示&#xff0c;GPT-4o mini 相较于 OpenAI 目前最先进的 AI 模型更加便…

FairGuard游戏加固入选《嘶吼2024网络安全产业图谱》

2024年7月16日&#xff0c;国内网络安全专业媒体——嘶吼安全产业研究院正式发布《嘶吼2024网络安全产业图谱》(以下简称“产业图谱”)。 本次发布的产业图谱&#xff0c;共涉及七大类别&#xff0c;127个细分领域。全面展现了网络安全产业的构成和重要组成部分&#xff0c;探…

微软发布iOS/安卓正式版Designer应用,AI修图功能助力创意设计

一、Microsoft Designer应用正式上线 AITOP100平台获悉&#xff0c;微软一直致力于为用户提供优质的创意工具&#xff0c;此次推出的Microsoft Designer应用正是其在移动端的重要布局。这款应用已正式上线iOS、Android、Windows和网页版本&#xff0c;满足不同用户的需求。微软…

Stable Diffusion 使用详解(2)---- 图生图原理,操作,参数

目录 背景 图生图原理 基本原理 1. 扩散模型基础 2. 图生图的具体流程 3. 关键技术点 4. 应用实例 CLIP 原理 1.基本概念 2. 核心特点 使用及参数 随机种子 重绘幅度 图像宽高 采样方法 1. DPM&#xff08;扩散概率模型&#xff09; 2. SDE&#xff08;随机微…

大语言模型-检索测评指标

1. MRR &#xff08;Mean Reciprocal Rank&#xff09;平均倒数排名&#xff1a; 衡量检索结果排序质量的指标。 计算方式&#xff1a; 对于每个查询&#xff0c;计算被正确检索的文档的最高排名的倒数的平均值&#xff0c;再对所有查询的平均值取均值。 意义&#xff1a; 衡量…

ChatTTS超强的真人AI语音助手下载使用教程

简介 ChatTTS是专门为对话场景设计的文本转语音模型&#xff0c;支持多人同时对话&#xff0c;适用的场景非常丰富&#xff0c;比如LLM助手对话任务&#xff0c;视频配音、声音克隆等。同时支持英文和中文两种语言。最大的模型使用了10万小时以上的中英文数据进行训练&#xf…

【Android】 dp与sp,加冕为王

目录 重要概念 屏幕尺寸 屏幕分辨率 屏幕像素密度 基础知识&#xff1a; ppi pt DPI 的定义和重要性 Android 中的 DPI 级别 px dp&#xff08;Density Independent Pixels&#xff09; sp&#xff08;Scale-independent Pixels&#xff09; 安卓的dp/dip、sp 虚拟…

设置浏览器网页全屏

在日常笔记本上办公时&#xff0c;由于屏幕较小&#xff0c;为了尽可能多和方便的显示浏览器网页上的内容&#xff0c;可以设置网页全屏的方式&#xff0c;去掉屏幕顶端的网址栏和底端栏&#xff0c;具体设置如下&#xff1a; 以Edge浏览器和Google Chrome浏览器为例&#xff…

如何免费用java c#实现手机在网状态查询

今天分享手机在网状态查询接口&#xff0c;该接口适用的场景非常广泛&#xff01;首先我们先讲下什么是手机在网状态&#xff1f;简单来说&#xff0c;就是你得手机号是否还在正常使用中&#xff0c;是否能够及时接收和回复信息&#xff0c;是否能够随时接听和拨打电话。如果你…

通过libx246 libfaac转换推送RTMP音视频直播流

一、RTMP简介及rtmplib库&#xff1a; RTMP协议是Real Time Message Protocol(实时信息传输协议)的缩写&#xff0c;它是由Adobe公司提出的一种应用层的协议&#xff0c;用来解决多媒体数据传输流的多路复用&#xff08;Multiplexing&#xff09;和分包&#xff08;packetizing…

C++ :友元类

友元类的概念和使用 (1)将类A声明为B中的friend class后&#xff0c;则A中所有成员函数都成为类B的友元函数了 (2)代码实战&#xff1a;友元类的定义和使用友元类是单向的 (3)友元类是单向的&#xff0c;代码实战验证 互为友元类 (1)2个类可以互为友元类&#xff0c;代码实战…

相同IP地址仿真测试

相同IP地址仿真测试 背景与挑战解决方案技术优势功能特点 背景与挑战 在汽车电子领域&#xff0c;电子控制单元&#xff08;ECU&#xff09;的测试是确保其功能性和可靠性的关键步骤。然而&#xff0c;当测试场景涉及多个配置相同IP地址的ECU时&#xff0c;传统的测试方法面临…

GooglePlay 金融品类政策更新(7月17号)

距离上次政策大更新&#xff08;4月5号&#xff09;才过去了3个月&#xff0c;Google Play又迎来了一次大更新&#xff0c;不得不说Google Play的要求越来越高了。 我们来梳理一下这次GooglePlay针对金融品类更新了哪些政策: 1.要求提供金融产品和服务的开发者必须注册为组织…

IDEA的常见代码模板的使用

《IDEA破解、配置、使用技巧与实战教程》系列文章目录 第一章 IDEA破解与HelloWorld的实战编写 第二章 IDEA的详细设置 第三章 IDEA的工程与模块管理 第四章 IDEA的常见代码模板的使用 第五章 IDEA中常用的快捷键 第六章 IDEA的断点调试&#xff08;Debug&#xff09; 第七章 …

STM32使用SPI向W25Q64存储信息(HAL库)

SPI全双工通信&#xff1a;全双工在时钟脉冲周期的每一个周期内&#xff0c;每当主设备同时发送一个字节的同时&#xff0c;会接受从设备接受一个字节数据&#xff0c;SPI全双工最大的特点就是发送和接受数据同步进行&#xff0c;发送多少数据就要接受多少数据。使用全双工通信…

vst 算法R语言手工实现 | Seurat4 筛选高变基因的算法

1. vst算法描述 &#xff08;1&#xff09;为什么需要矫正 image source: https://ouyanglab.com/singlecell/basic.html In this panel, we observe that there is a very strong positive relationship between a gene’s average expression and its observed variance. I…