NIO之Buffer

8.5/Q1,Charls最新高分文章解读! 8 257名受试者中,672人(8.14%)在9年内发生过卒中。在调整的多因素cox回归模型中,TyG和ABSI仍然是卒中的预测因素,TyG的HR为1.25(95%CI:1.06~1.47),ABSI的HR为1.33(95%CI:1.06~1.68)。TyG和ABSI联合诊断效能最高(AUC:0.579,95%CI:0.553~0.597),而TyG(AUC:0.566,95%CI:0.544~0.587)和ABSI(AUC:0.533,95%CI:0.524~0.597)的诊断效能最低。 阅读详情

Java NIO中的Buffer用于和NIO通道进行交互。数据是从通道读入缓冲区,从缓冲区写入到通道中的。缓冲区本质上是一块可以写入数据,然后可以从中读取数据的内存。这块内存被包装成NIO Buffer对象,并提供了一组方法,用来方便的访问该块内存。

Buffer的基本用法

四个步骤

  1. 写入数据到Buffer
  2. 调用flip()方法
  3. 从Buffer中读取数据
  4. 调用clear()方法或者compact()方法
RandomAccessFile raf = new RandomAccessFile("D:/data.txt", "rw");
FileChannel fileChannel = raf.getChannel();

// 创建buffer
ByteBuffer buf = ByteBuffer.allocate(48);
// read into buffer
int bytesRead = fileChannel.read(buf);
while (bytesRead != -1) {

    System.out.println("Read " + bytesRead);
    // 从写模式转换为读模式
    buf.flip();
    while(buf.hasRemaining()){
        System.out.print((char) buf.get());
    }
   // 清空缓存区,再次写入
    buf.clear();
    bytesRead = fileChannel.read(buf);
}
raf.close();

Buffer的类型

Buffer的类型

  • 对于每个原始类型,都有一个缓冲区类型,所有缓冲区都可以实现缓冲区接口。 大多数使用的缓冲区类型是ByteBuffer。和数组类似,具有固定的容量大小。

Buffer的分配

  • 要想获得一个Buffer对象首先要进行分配。 每一个Buffer类都有一个allocate方法。下面是一个分配48字节capacity的ByteBuffer的例子。
ByteBuffer buf = ByteBuffer.allocate(48);

向Buffer中写数据

两种方式

  1. 从Channel写到Buffer。
int bytesRead = inChannel.read(buf); // read into buffer
  1. 通过Buffer的put()方法写到Buffer里。
 // put方法有很多版本,允许你以不同的方式把数据写入到Buffer中。
 // 例如, 写到一个指定的位置,或者把一个字节数组写入到Buffer。 更多Buffer实现的细节参考JavaDoc。
buf.put(127);

从缓冲区读取数据

两种方式

  • 从Buffer中读取数据到capacity。
// read from buffer into channel.
int bytesWritten = inChannel.write(buf);
  • 使用get()方法从Buffer中读取数据。
// get方法有很多版本,允许你以不同的方式从Buffer中读取数据。
// 例如,从指定position读取,或者从Buffer中读取数据到字节数组。更多Buffer实现的细节参考JavaDoc。
byte aByte = buf.get();  // 一次读取一个字节

Buffer的capacity,position和limit

  • Buffer有两种模式,写模式和读模式。
  • capacity:在读/写模式下都是固定的,就是我们分配的缓冲大小。一旦Buffer满了,需要将其清空(通过读数据或清除数据),才可以继续往里写数据。
  • position:类似于读/写指针,表示当前读/写的位置。初始值为0,最大值为capacity - 1。当Buffer从写模式切换道读模式时,position会被 重置为0。
  • limit:写模式下,表示最大能写多少数据,此时和capacity相同。读模式下,表示最多能读取到多少数据,此时和缓存区的实际大小相同(写模式下的position)。
    Buffer读写模式图

flip()

  • flip():Buffer从写模式转换为读模式。position设置为Buffer的头部0,limit设置为写模式下的position,mark设置为-1
  • flip()源码
public final Buffer flip() {
    limit = position;
    position = 0;
    mark = -1;
    return this;
}

clear()与compact()

  • 一旦读完Buffer中的数据,需要让Buffer准备好再次被写入。可以通过clear()或compact()方法来完成。
  • clear():表示Buffer被清空了,position被设置为0,limit被设置为capacity。Buffer中的数据被没有清空,只是这些标记可以告诉我们可以从哪里开始往Buffer写数据了。如果有数据还没被读取,调用clear()后,数据会被遗忘,没有任何标记可以告诉你那些已被读取,那些还没有被读取。
  • compact():如果Buffer有未读数据且后续还需要这些数据,那么compact()将保留这些未读数据。此时,会将未读的数据复制到Buffer的开头处,并将position设置为最后一个未读元素的后面。limit设置为capacity。

mark()和reset()

  • mark():标记Buffer中一个特定的position。
  • reset():恢复到mark()标记的position。
buffer.mark(); // 标记position
buffer.reset();  // 恢复到mark()标记处

equals()和compareTo()

  • 剩余元素指Buffer中position到limit之间的元素。
  • equals()
    当满足以下两个条件时,说明两个Buffer相等:当满足以下两个条件时,说明两个Buffer相等:
    1. 相同的类型(byte, char, int等);
    2. Buffer中剩余的byte,char等元素个数相等;
    3. Buffer中剩余的byte,char等元素都相同;
    4. equals()只比较Buffer中的部分元素(剩余的元素),并不是比较Buffer中的全部元素 。
  • compareTo()
    compareTo()方法比较两个Buffer的剩余元素(byte、char等), 如果满足下列条件,则认为一个Buffer“小于”另一个Buffer:
    1. 第一个不相等的元素小于另一个Buffer中对应的元素 。
    2. 所有元素都相等,但第一个Buffer比另一个先耗尽(第一个Buffer的元素个数比另一个少)。

rewind()

  • 表示重读Buffer中的所有数据。position置为0,limit保持不变。同时取消mark()标记。
  • 源码
public final Buffer rewind() { 
	position = 0; 
    mark = -1; 
    return this; 
} 

Scatter/Gather

用于描述从Channel中读取或写入到Channel的操作。

Scatter(分散)

指在读操作时,将从Channel中读取的数据分散到多个Buffer中。
scatter

示例

ByteBuffer header = ByteBuffer.allocate(128);
ByteBuffer body   = ByteBuffer.allocate(1024);
ByteBuffer[] bufferArray = { header, body };
channel.read(bufferArray);
  • Buffer首先被插入到数组,然后将数组作为channel.read()的参数。read()方法将将从Channel中的读取的数据按照Buffer在数组中的顺序依次插入,当前一个Buffer被写满后,才会向下一个Buffer中写入。
  • Scattering Reads在移动下一个buffer前,必须填满当前的buffer,这也意味着它不适用于动态消息(消息大小不固定)。换句话说,如果存在消息头和消息体,消息头必须完成填充(例如 128byte),Scattering Reads才能正常工作。

Gathering Writes

指在写操作时,将多个Buffer中的数据聚集起来,一起写入到Channel中。
Gather

示例

ByteBuffer header = ByteBuffer.allocate(128);
ByteBuffer body   = ByteBuffer.allocate(1024);
//write data into buffers
ByteBuffer[] bufferArray = { header, body };
channel.write(bufferArray);

buffers数组是write()方法的入参,write()方法会按照buffer在数组中的顺序,将数据写入到channel,注意只有position和limit之间的数据才会被写入。因此,如果一个buffer的容量为128byte,但是仅仅包含58byte的数据,那么这58byte的数据将被写入到channel中。因此与Scattering Reads相反,Gathering Writes能较好的处理动态消息。

参考 并发编程网 – ifeve.com

20个闭环渗透测试项目:从漏洞发现到简历突围 渗透测试不仅是工具使用,更是对系统设计缺陷与实现偏差的深度推演。理解OWASP Top 10、Burp Suite等基础能力只是起点,真正具备工程价值的是能复现、可验证、可协作的完整攻击链。本文聚焦真实业务场景下的SSRF协议绕过、JWT签名机制缺陷、Redis未授权利用、Kong网关配置风险及etcd存储结构分析等核心热词,揭示漏洞本质在于架构决策与配置偏差的叠加态。适用于红队实战、甲方安全建设与乙方渗透审计等多类岗位,帮助从业者将技术动作升维为技术叙事。 阅读详情

相关推荐

Android 默认授予所有应用权限以及特殊权限处理

PackageManagerService作为android的主要系统服务之一,包含处理应用权限相关的职责。源码地址如下:在PMS成功启动时并收到回掉systemReady回进行应用权限授予。DefaultPermissionGrantPolicy为权限处理策略管理类。这里并没有赋予所有系统应用权限,所以当进行应用时还是会显示权限检查的弹框。可通过此方法进行所有应用权限赋予:如果不想所有应用都授予权限,可考虑在system/etc下的权限相关xml文件添加应用包名和所需权限。

Jimmy的专栏 1509

NIO之Buffer解读

Java NIO 中的 Buffer 用于和 NIO 通道进行交互。数据是从通道读入缓冲区,从缓冲 区写入到通道中的。缓冲区本质上是一块可以写入数据,然后可以从中读取数据的内存。这块内存被包装 成 NIO Buffer 对象,并提供了一组方法,用来方便的访问该块内存。缓冲区实际上是 一个容器对象,更直接的说,其实就是一个数组,在 NIO 库中,所有数据都是用缓冲 区处理的。在读取数据时,它是直接读到缓冲区中的;在写入数据时,它也是写入到 缓冲区中的;

一个菜鸡的博客 1657

【鸿蒙实战开发】HarmonyOS申请调试签名证书过程

这份鸿蒙(HarmonyOS NEXT)资料包含了鸿蒙开发必掌握的核心知识要点,内容包含了(ArkTS、ArkUI开发组件、Stage模型、多端部署、分布式应用开发、音频、视频、WebGL、OpenHarmony多媒体技术、Napi组件、OpenHarmony内核、Harmony南向开发、鸿蒙项目实战等等)鸿蒙(HarmonyOS NEXT)技术知识点。

HarmonyOS_002的博客 3561

NIO之Buffer缓冲区

NIO简介 Java.nio全称Java non-blocking IO或Java New IO,是从jdk1.4 开始引入的一套新的IO api(New IO) ,为所有的原始类型(boolean类型除外)提供缓存支持的数据容器,使用它可以提供非阻塞式的高伸缩性网络。 ​ IO操作的模式: ​ PIO(Programing IO): 所有的IO操作由CPU处理,CPU占用率比较高 ...

ShawnaVayne_的博客 535

以太网MII、RMII、GMII、RGMII(三)

RMII接口收发的数据位宽为2bit,因此管脚数目大为减少,在高密端口PHY中应用较多,但是由于其是MAC和PHY共用一个参考时钟,接口之间的距离不能太远;一般的GMII接口都有两个发送参考时钟:TX_CLK和GTX_CLK,两者的方向是不一样的,前者有PHY提供(同MII),后者由MAC或外部参考时钟源提供,绝大多数GMII接口都是兼容MII接口的,在用作MII模式时,使用TX_CLK和8根数据线中的4根。MII接口中的接收时钟和发送时钟是分开的,而且都是由PHY芯片提供给MAC芯片的。

qq_42357877的博客 2332

【笔试真题】- 华子-2025.12.17-研发岗

难度:中等难度:中等偏难难度:中等K小姐是一名服务器运维工程师,她负责监控公司服务器的访问日志。服务器采用指数退避策略来优化访问频率,每次重试的时间间隔会按照某种规律增长。经过一段时间的监控,K小姐记录了 nnn 个访问时间点,第 iii 个时间点的值为 a[i]a[i]a[i](可能有重复)。现在,她想分析这些访问时间点是否符合某种特定的模式。具体来说,对于给定的参数对 (x,y)(x, y)(x,y),她想知道:有多少个访问时间点 a[i]a[i]a[i] 满足 a[i]=xK+ya[i] = x^K

春秋招笔试突围 186

【Java进阶】NIO(二)<Buffer>

Buffer缓冲区实际上就是一个数组,把数组的内容和信息包装成一个Buffer对象,它提供了一组访问这些信息的方法在NIO中关键的Buffer① ByteBuffer、CharBuffer、DoubleBuffer、FloatBuffer、IntBuffer、LongBuffer、ShortBuffer,这些Buffer覆盖了能够通过I/O发送的所有基本类型byte、char、double、float、int、long、short等② 实际上使用较多的是ByteBuffer、CharBuffer。

行为产生结果 1207

YOLOv8多传感器融合技术——摄像头阵列融合技术详解

本文详细介绍了基于YOLOv8的摄像头阵列融合技术,该技术通过多摄像头协同工作实现360度无死角环境感知。文章阐述了系统原理,包括全方位视野覆盖、冗余设计和深度感知等优势,并提供了完整的Python实现代码。关键技术涵盖多摄像头检测、立体匹配、3D投影和目标融合等模块,支持时间域融合提升稳定性。该系统可显著提高自动驾驶的环境感知能力,减少检测盲区,增强系统可靠性,是L4-L5级自动驾驶的关键技术之一。文章还展示了城市驾驶场景的实际应用,验证了该技术对复杂交通环境的适应能力。

u010117029的博客 213

【NIO】Buffer(缓冲区)

Buffer 缓冲区功能,capacity,limit,position 属性以及 flip 等方法说明。

yhl_jxy的博客 3934

moveit——基于octomap的碰撞检测

机械臂对棚顶进行碰撞检测。

如果想成为中心,那么就到中心去吧。 1355

RK3588 DDR5 方案

RK3588 DDR5方案支持多种LPDDR5/LPDDR5X内存型号,包括美光、三星、海力士、江波龙和佰维等品牌。文档详细列出了已验证的DDR5内存规格,涵盖2GB-16GB容量范围,提供组织形式、封装类型和测试状态等信息。其中美光型号最全面,支持12GB/16GB大容量方案。部分型号处于测试验证阶段(T/A),需量产进一步确认性能。该方案为RK3588平台开发提供可靠的内存选型参考。

501846585_QQAndroid_java 1081

NIO组件之Buffer详解

Buffer类的capacity属性,表示内部容量的大小。一旦写入的对象数量超过了capacity容量,缓冲区就满了,不能再写入了。Buffer类的capacity属性一旦初始化,就不能再改变。原因是什么呢?Buffer类的对象在初始化时,会按照capacity分配内部数组的内存,在数组内存分配好之后,它的大小当然就不能改变了。Buffer类是一个抽象类,Java不能直接用来新建对象。属性说明capacity容量,即可以容纳的最大数据量;在缓冲区创建时设置并且不能改变limit。...

ntzzzsj的博客 1506

Ubuntu Rtx3090 Cuda11.7 安装 pytorch3d

pytorch ubuntu pytorch3d 安装

G果的博客 2273

Java NIO之Buffer

NIO Buffer 是NIO的核心之一。 在与 NIO Channel 进行交互时, 需要使用 NIO Buffer, 将数据从 Buffer读取到 Channel 或者从 Channel 中写入Buffer 中

学习、学习、再学习 609

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

java nio(nio机制buffer及buffer优化)

<br />深入Buffer:<br />    下面,我们看下NIO中buffer的两个重要的组成部分:<br />buffer的状态变量和buffer的访问方法;<br />    状态变量是buffer内部计数系统的关键,在每一次的read/write过程中,buffer的状态变量都是变化的。通过记录和跟踪这些状态变化,buffer就可以在内部完成操作资源的控制;    <br />    当你从channel中读取数据的时候,数据被存放到buffer中;有的时候,你直接把获得的buffer数据集传递

biexf的专栏 7628

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

JAVA NIO组件之Buffer详解

Java NIO(New I/O)中,Buffer是一个重要的组件,它作为数据的容器,主要用于数据的读写操作。Buffer本质上是一个内存块,可以写入数据,也可以从中读取数据。

码到三十五 1224

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

NIO的Buffer

package com.atguigu.nio; import java.nio.IntBuffer; public class BasicBuffer { public static void main(String[] args) { //举例说明Buffer 的使用 (简单说明) //创建一个Buffer, 大小为 5, 即可以存放5个int IntBuffer intBuffer = IntBuffer.allocate(5); .

qq_39368007的博客 190

【源码解析】Java NIO 包中的 Buffer

Buffer 是 JDK 1.4 引入的 NIO 包下面的一个核心类,主要是为了提供一种更高效、更灵活的方式来进行 I/O 操作。对于传统的 IO ,往往会涉及到多次内存的复制,比如从内核态复制到用户态,再赋值到应用程序缓冲区,Buffer 就提供了一种直接映射内存区域的可能,减少这些数据的复制,提高查询的效率。除此外,Buffer 在 NIO 中用来存储数据的容器,Channel 通过 Buffer 进行读写操作,从而实现高效的 NIO,也就是非阻塞 IO。

Jwasx的博客 1603

NIO之旅Buffer

在上一篇文章中聊了一下Channel,这篇文章聊一下Java NIO中的另一个重要的组件:Buffer。 Buffer的概念 首先我们先看一下Buffer的类图,Buffer在java.nio中被定义为抽象类: Buffer被称为内存缓冲区,本质上也是内存中的一块,我们可以将数据写入内存中,之后从这块内存中读取数据。也可以将这个块内存封装成NIO Buffer对象,并提供一组常用的方法,方便对这块内存进行读写操作。 在Java NIO中,所有的数据都要经过Buffer,我们可以将Buffer理解为一个数组

程铭程铭你快成名的博客 7933

NIO03——Buffer

一、Buffer 简介  Java NIO 中的 Buffer 用于和 Channell 交互,像之前说的那样,数据从 Channel 读入到 Buffer,从 Buffer 写入到 Channel。  Buffer 本质上是一块内存,你可以向其中写入数据,之后再从中读取你写入的数据。这一块内存被包装成了一个 NIO Buffer 对象,这个对象提供了一些便于访问该内存的方法。 二、Buffer ...

如不來的博客 589

Java NIO(三)NIO之Buffer

系列文章目录 第一篇 Java NIO(一)I/O简介 第一篇 Java NIO(二)BIO 第一篇 Java NIO(三)NIO之Buffer 第一篇 Java NIO(四)NIO之Channel 第一篇 Java NIO(五)NIO之Selector 第一篇 Java NIO(六)Netty) Java NIO(三)NIO之Buffer 目录系列文章目录Java NIO(三)NIO之Buffer前言一、示例代码二、Buffer1. 介绍2. Buffer分类3. Buffer的基本原理4. Buffe

Devinskx的博客 321

Java NIO Buffer

缓冲区本质上是一个内存块,您可以在其中读和写数据。NIO的Buffer对象是对该内存块的一个封装,其向外提供了一组方法,可以更轻松地使用该内存块。 flip() rewind() clear() compact() mark() reset() 详解

OLai's blog 362

java buffer nio_Java NIO Buffer过程详解

前言在与NIO通道交互时使用Java NIO Buffer。 如您所知,数据从通道读入缓冲区,并从缓冲区写入通道。缓冲区本质上是一个可以写入数据的内存块,然后可以再次读取。 此内存块包含在NIO Buffer对象中,该对象提供了一组方法,可以更轻松地使用内存块。基本缓冲区用法使用缓冲区读取和写入数据通常遵循这4个小步骤:1.写入数据到缓冲区2.调用 buffer.flip()3.从缓冲区读取数据4...

weixin_32251525的博客 244

图解Java NIO Buffer

Buffer四个基本属性 1、capacity:能够容纳的最大元素数目,创建时设定并不能更改 2、limit: buffer中有效位置数目 3、position: 下一个读或者写的位置 4、mark: 用于记忆的标志位,配合reset()使用,初始值未设定,调用mark后将当前position设为值 标记、位置、限制和容量值有以下关系: 0 <= 标记 <= 位置 <= 限制 <= 容量

I am not a quitter. 1436

NIO源码系列之Buffer

NIO与Netty源码系列一Buffer基本属性基本方法positionlimitmarkresetclearflipremaininghasRemaining子类IntBufferallocateputgetwrap(int[] array)wrap(int[] array, int offset, int length)get(int i)get(int[] dst, int offset, ...

王伟王胖胖的博客 596
上一篇: Java之NIO
下一篇: NIO之通道之间的数据传输
菜鸟=大神
博客等级 码龄11年 5粉丝 43原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值