第一百七十二节 Java IO教程 - Java I/O缓冲区

news2024/9/22 10:03:45

Java IO教程 - Java I/O缓冲区

什么是NIO?

在NIO中,我们处理I/O操作的通道和缓冲区。

像流一样的通道表示数据源/接收器和用于数据传输的Java程序之间的连接。

通道提供双向数据传输设施。我们可以使用通道来读取数据以及写入数据。根据我们的需要,我们可以获得只读通道,只写通道或读写通道。

在基于流的I/O中,数据传输的基本单位是一个字节。在基于通道的NIO中,数据传输的基本单位是缓冲器。

缓冲区具有确定其可以包含的数据的上限的固定容量。

在基于通道的I/O中,我们将数据写入缓冲区,并将该缓冲区传递到写入数据的通道。

为了从数据源读取数据,我们向一个通道传递一个缓冲区。通道将数据从数据源读入缓冲区。

缓冲区

缓冲区是固定长度的数据容器。有一个单独的缓冲区类型来保存每种类型的基本值的数据,除了布尔类型值。

缓冲区是我们程序中的一个对象。我们有一个单独的类来表示每种类型的缓冲区。

所有缓冲区类都继承自一个抽象的Buffer类。包含原始值的缓冲区类如下:

  • ByteBuffer
  • ShortBuffer
  • CharBuffer
  • IntBuffer
  • LongBuffer
  • FloatBuffer
  • DoubleBuffer

不同的缓冲区保存不同数据类型的数据。例如,ByteBuffer保存字节值; ShortBuffer保存短值;一个CharBuffer保存字符,等等。

缓冲区属性

以下是缓冲区的四个重要属性。

  • Capacity
  • Position
  • Limit
  • Mark

缓冲区的容量是它可以容纳的元素的最大数量。并且当创建缓冲器时它是固定的。

我们可以通过调用hasArray()方法检查缓冲区是否由数组支持,如果缓冲区由数组支持则返回true。

我们可以通过使用缓冲对象的array()方法来访问支持数组。

一旦我们访问了后台数组,对该数组所做的任何更改都将反映在缓冲区中。

缓冲区具有返回其容量的capacity()方法。

缓冲区创建

我们可以使用特定缓冲区类的allocate()工厂方法创建一个缓冲区,如下所示:

以下代码创建一个容量为8的字节缓冲区

ByteBuffer bb  = ByteBuffer.allocate(8);

获得容量

int capacity = bb.capacity();

以下代码创建一个容量为1024的字符缓冲区

CharBuffer cb  = CharBuffer.allocate(1024);

字节缓冲区有一个名为allocateDirect()的方法,它创建一个字节缓冲区,从操作系统内存中分配内存,而不是从JVM堆中分配内存。

我们可以使用ByteBuffer类的isDirect()方法来检查缓冲区是直接还是非直接。

// Create a  direct byte   buffer of  512  bytes capacity
ByteBuffer bbd = ByteBuffer.allocateDirect(512);

另一种创建缓冲区的方法是使用缓冲区的static wrap()方法包装数组。

byte[]  byteArray = new byte[512];
ByteBuffer bb  = ByteBuffer.wrap(byteArray);

我们可以使用相同的技术来创建缓冲区来存储其他原始值。

当我们创建一个缓冲区时,缓冲区的所有元素都被初始化为零值。

缓冲区索引位置

缓冲区的每个元素都有一个索引。第一个元素的索引为0,最后一个元素的索引为capacity-1。

创建缓冲区时,其位置设置为0,其限制等于其容量。

我们可以使用它的重载position()方法获取/设置缓冲区的位置。

position()方法返回缓冲区位置的当前值。

position(int newPosition)方法将缓冲区的位置设置为指定的newPosition值,并返回缓冲区的引用。

我们可以使用它的重载limit()方法获取/设置缓冲区的限制。

limit()方法返回缓冲区限制的当前值。limit(int newLimit)方法将缓冲区的限制设置为指定的newLimit值,并返回缓冲区的引用。

我们可以使用mark()方法为缓冲区的位置添加书签。当我们调用mark()方法时,缓冲区将其位置的当前值存储为其标记值。我们可以通过使用reset()方法将缓冲区的位置设置为之前加书签的值。

缓冲区的标记在创建时未定义。只有当定义了它的标记时,我们才必须在缓冲区上调用reset()方法。否则,reset()方法会抛出InvalidMarkException异常。

以下代码创建一个新缓冲区并显示其四个属性。

import java.nio.ByteBuffer;
import java.nio.InvalidMarkException;

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

    System.out.println("Capacity: " + bb.capacity());
    System.out.println("Limit: " + bb.limit());
    System.out.println("Position: " + bb.position());

    // The mark is not set for a new buffer. Calling the
    // reset() method throws a runtime exception if the mark is not set.
    try {
      bb.reset();
      System.out.println("Mark: " + bb.position());
    } catch (InvalidMarkException e) {
      System.out.println("Mark is not  set");
    }
  }
}

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

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

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

相关文章

【python】Python常见的面试题解析:深入探索与实践,助你少走弯路

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,…

Redis分布式系统中的主从复制

本篇文章主要对Redis的主从复制进行讲解。主要分析复制的原理,包括:建立复制、全量复制、部分复制、全量复制、心跳检测等。希望本篇文章会对你有所帮助。 文章目录 一、主从复制简介 二、配置主从复制模式 断开主从复制 安全性 只读 传输延迟 三、拓扑结构 四、主…

秋招复习笔记——八股文部分:网络TCP

TCP 三次握手和四次挥手 TCP 基本认识 序列号:在建立连接时由计算机生成的随机数作为其初始值,通过 SYN 包传给接收端主机,每发送一次数据,就「累加」一次该「数据字节数」的大小。用来解决网络包乱序问题。 确认应答号&#xf…

字符的统计——423、657、551、696、467、535

423. 从英文中重建数字 最初思路 首先要有一个指针,对于3/4/5为一组地跳跃。起初想的是后瞻性,如果符合0-9任意,则更换index、跳跃。此时写了一个函数,用来判断s的截取段和0-9中有无符合。这个思路并没有进行下去,虽然…

C++ - 基于多设计模式下的同步异步⽇志系统

1.项目介绍 项⽬介绍 本项⽬主要实现⼀个⽇志系统, 其主要⽀持以下功能: • ⽀持多级别⽇志消息 • ⽀持同步⽇志和异步⽇志 • ⽀持可靠写⼊⽇志到控制台、⽂件以及滚动⽂件中 • ⽀持多线程程序并发写⽇志 • ⽀持扩展不同的⽇志落地⽬标地 2.开发环境 • Cent…

第二证券:净现比是什么?怎么计算?

1、净现比的含义 净现比是指运营活动产生的现金净流量与净获利的百分比,是用来衡量企业实在盈利才干的目标。净现比也叫做净获利现金含量,即企业的净获利中,有多少转化成现金进入我们的钱包。 2、净现比的核算 净现比的核算公式为&#xf…

聊聊预训练模型的微调

前言 Transformers 提供了一个 Trainer 类,处理微调在数据集上提供的任何预训练模型。 完成所有数据预处理工作后,只需执行几个步骤即可定义 Trainer。 最困难的部分可能是准备运行 Trainer.train() 的环境,因为它在 CPU 上运行速度非常慢。…

全面解析:如何开发智能的食堂采购管理系统

今天,小编将全面解析如何开发一个智能的食堂采购系统,包括需求分析、系统设计、技术选择、开发过程以及测试和部署等方面。 一、需求分析 在开发智能食堂采购系统之前,首先需要进行详细的需求分析。这一步至关重要,因为它直接决定…

【Java 数据结构】ArrayList类介绍

ArrayList类介绍 初识List接口ArrayList类ArrayList类是什么顺序表的模拟实现初始化增加元素删除元素查找元素修改元素 ArrayList类使用构造方法ArrayList源码阅读常用方法及其注意事项 初识List接口 List 是集合框架中的一个接口, 它的里面包含了一些方法, 例如add(), remove…

【Python系列】详解 open 函数:文件操作的基石

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

OpenAI 发完 GPT-4o,国内大模型行业还有哪些机会?

AI视频生成:小说文案智能分镜智能识别角色和场景批量Ai绘图自动配音添加音乐一键合成视频百万播放量 全世界范围内的很多人,我也不例外,想象中的GPT5发布时间应该是24年中,但实际上OpenAI在这个时间点最强的模型是GPT4o&#xff0…

利用一维数组计算今天是今年的第几天

分析: 在一维数组里初始化12个月份,在进行判断是不是闰年,是闰年就把数组的二月的下标改为29,否则不变就按照平年计算,最后把想要计算的月份减1累加到sum里,在进行计算该月份的天也要累加。例如&#xff1a…

Python:对常见报错导致的崩溃的处理

Python的注释: mac用cmd/即可 # 注释内容 代码正常运行会报以0退出,如果是1,则表示代码崩溃 age int(input(Age: )) print(age) 如果输入非数字,程序会崩溃,也就是破坏了程序,终止运行 解决方案&#xf…

FPGA-ROM IP核的使用(2)

前言 接着昨天的进行一个小的实验验证ROM IP核。 实验效果 读取上一期生成的IP核中的数据,并将其显示在数码管上。 具体流程 ROM IP核存放数据0~255,之后每隔0.2s,从0的地址开始读数据,并显示在数码管上;接着先后…

力扣 快慢指针

1 环形链表 141. 环形链表 - 力扣(LeetCode) 定义两个指针,一快一慢。慢指针每次只移动一步,而快指针每次移动两步。初始时,慢指针和快指针都在位置 head,这样一来,如果在移动的过程中&#x…

Flink入门(更新中)

目录 一、Flink 1.1 基本概念 1.1.1 flink简介 1.2 flink编程模版 1.3 常用概念 1.2.1 datastream 1.2.2 算子、Task 1.2.3 多流操作 1.2.6 时间语义 二、Flink编程实战(Java) 2.1 wordcount 一、Flink 1.1 基本概念 1.1.1 flink简介 1.图片介绍 性能&#xff1a…

Python 爬虫(爬取百度翻译的数据)

前言 要保证爬虫的合法性,可以从以下几个方面着手: 遵守网站的使用条款和服务协议:在爬取数据之前,仔细阅读目标网站的相关规定。许多网站会在其 robots.txt 文件中明确说明哪些部分可以爬取,哪些不可以。 例如&…

Java语言程序设计基础篇_编程练习题**15.19 (游戏:手眼协调)

**15.19 (游戏:手眼协调) 请编写一个程序,显示一个半径为10像素的实心圆,该圆放置在面板上的随机位置,并填充随机的顔色,如图15-29b所示。单击这个圆时,它会消失,然后在另一个随机的位置显示新的随机颜色的…

PySimpleGUI的安装、使用介绍

PySimpleGUI的安装等介绍 如果直接使用pip命令是无法下载免费版的,通过设置的python Interpreter也不可以下载到5.0.0之前的版本了。 现在已经无法通过pycharm直接获取到PySimpleGUI的免费(无需登录)版,不过听说可以登入官网然后进…

OpenTeleVision复现及机器人迁移

相关信息 标题 Open-TeleVision: Teleoperation with Immersive Active Visual Feedback作者 Xuxin Cheng1 Jialong Li1 Shiqi Yang1 Ge Yang2 Xiaolong Wang1 UC San Diego1 MIT2主页 https://robot-tv.github.io/链接 https://robot-tv.github.io/resources/television.pdf代…