java基础·杂(NIO之ByteBuffer)

Java NIO 字节缓冲区(ByteBuffer)使用全攻略 Java NIO(New Input/Output)是Java 1.4引入的新的I/O API,它提供了一种非阻塞的、基于缓冲区的I/O操作方式,相比传统的I/O API,具有更高的性能和效率。字节缓冲区(ByteBuffer)是Java NIO中最常用的缓冲区之一,它用于在Java程序和底层I/O设备之间进行字节数据的读写操作。本文的目的是全面介绍ByteBuffer的使用,包括其核心概念、算法原理、操作步骤、实际应用场景等,帮助读者深入理解和掌握ByteBuffer的使用方法。 阅读详情

接触了NIO的东西,这里记下,方便以后查阅。

1,NIO

Java NIO(New IO)是一个可以替代标准Java IO API的IO API(从Java 1.4开始),Java NIO提供了与标准IO不同的IO工作方式。

Channels and Buffers(通道和缓冲区)

    标准的IO基于字节流和字符流进行操作的,而NIO是基于通道(Channel)和缓冲区(Buffer)进行操作,数据总是从通道读到缓冲区中,或者从缓冲区写入到通道中。

Java NIO的通道类似流,但又有些不同:

    既可以从通道中读取数据,又可以写数据到通道。但流的读写通常是单向的。

    通道可以异步地读写。

    通道中的数据总是要先读到一个Buffer,或者总是要从一个Buffer中写入。

Channel的实现:
   FileChannel 从文件中读写数据。-常用
   DatagramChannel 能通过UDP读写网络中的数据。
   SocketChannel 能通过TCP读写网络中的数据。-常用

  ServerSocketChannel可以监听新进来的TCP连接,像Web服务器那样。对每一个新进来的连接都会创建一个SocketChannel。

2,案例

例如:

Channels and Buffers的例子:
RandomAccessFile aFile = new RandomAccessFile("data/nio-data.txt", "rw");//参数 mode 的值可选 "r":可读,"w" :可写,"rw":可读性;
FileChannel inChannel = aFile.getChannel();//返回与此文件关联的唯一 FileChannel 对象。
ByteBuffer buf = ByteBuffer.allocate(48);//create buffer with capacity of 48 bytes
int bytesRead = inChannel.read(buf); //read into buffer.将字节序列从此通道读入给定的缓冲区。读取的字节数,可能为零,如果该通道已到达流的末尾,则返回 -1
while (bytesRead != -1) {
  buf.flip();  //make buffer ready for read
  while(buf.hasRemaining()){//告知在当前位置和限制之间是否有元素。当且仅当此缓冲区中至少还有一个元素时返回 true
      System.out.print((char) buf.get()); // read 1 byte at a time.相对 get 方法。读取此缓冲区当前位置的字节,然后该位置递增。返回:缓冲区当前位置的字节
  }
  buf.clear(); //make buffer ready for writing
  bytesRead = inChannel.read(buf);
}
aFile.close();

通道可以由FileInputStream,FileOutputStream,RandomAccessFile三个类来产生,例如:FileChannel fc = new FileInputStream().getChannel();与通道交互的一般方式就是使用缓冲器,可以把通道比如为煤矿(数据区),而把缓冲器比如为运煤车,想要得到煤一般都通过运煤车来获取,而不是直接和煤矿取煤。

3,Buffer

在NIO中,数据的读写操作始终是与缓冲区相关联的,读取时,信道(SocketChannel)将数据读入缓冲区,写入时首先要将发送的数据按顺序填入缓冲区。缓冲区是定长的,基本上它只是一个列表,它的所有元素都是基本数据类型。ByteBuffer是最常用的缓冲区,它提供了读写其他数据类型的方法,且信道的读写方法只接收ByteBuffer。

使用Buffer读写数据一般遵循以下四个步骤:
1,写入数据到Buffer
2,调用flip()方法,反转缓冲区,将Buffer从写模式切换到读模式
3,从Buffer中读取数据
4,调用clear()方法或者compact()方法。clear()方法会清空整个缓冲区。compact()方法只会清除已经读过的数据,任何未读的数据都被移到缓冲区的起始处,新写入的数据将放到缓冲区未读数据的后面。

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

为了理解Buffer的工作原理,需要熟悉它的三个属性:

capacity,position,limit

position和limit的含义取决于Buffer处在读模式还是写模式。不管Buffer处在什么模式,capacity的含义总是一样的。

capacity

作为一个内存块,Buffer有一个固定的大小值,也叫“capacity”.你只能往里写capacity个byte、long,char等类型。一旦Buffer满了,需要将其清空(通过读数据或者清除数据)才能继续写数据往里写数据。

position
当你写数据到Buffer中时,position表示当前的位置。初始的position值为0.当一个byte、long等数据写到Buffer后, position会向前移动到下一个可插入数据的Buffer单元。position最大可为capacity – 1.

当读取数据时,也是从某个特定位置读。当将Buffer从写模式切换到读模式,position会被重置为0. 当从Buffer的position处读取数据时,position向前移动到下一个可读的位置。

limit
在写模式下,Buffer的limit表示你最多能往Buffer里写多少数据。 写模式下,limit等于Buffer的capacity。

当切换Buffer到读模式时, limit表示你最多能读到多少数据。因此,当切换Buffer到读模式时,limit会被设置成写模式下的position值。换句话说,你能读到之前写入的所有数据。

创建ByteBuffer

使用allocate()静态方法
    ByteBuffer buffer=ByteBuffer.allocate(256);

    以上方法将创建一个容量为256字节的ByteBuffer,如果发现创建的缓冲区容量太小,唯一的选择就是重新创建一个大小合适的缓冲区。

通过包装一个已有的数组来创建
    如下,通过包装的方法创建的缓冲区保留了被包装数组内保存的数据.

    ByteBuffer buffer=ByteBuffer.wrap(byteArray);

    如果要将一个字符串存入ByteBuffer,可以如下操作:
    String sendString="你好,服务器. ";

    ByteBuffer sendBuffer=ByteBuffer.wrap(sendString.getBytes("UTF-16"));



java.nio.ByteBuffer常用方法详解 一、前言 在Java nio中,主要有三大组件:Buffer,Channel和Selector。这三者之间的关系可以按照如下方式进行理解: Buffer提供了一个字节缓冲区,其可以不断的从Channel中读取接收到的数据。Buffer的优点主要在于其提供了一系列的Api,能够让用户更方便的对数据进行读取和写入; Channel简单来说就是一个信道,也就是客户端与服务器的一个连接,而且每个客户端都会对应一个Channel对象; Selector是Java nio能够支持高并发数据处理一个关键,其核心理 阅读详情

相关推荐

Java NIO学习笔记:深入解析ByteBuffer用法

Java NIO是一种基于通道(Channel)和缓冲区(Buffer)的I/O操作方法论,它提供了与传统IO不同的I/O操作方式。传统IO是基于流的,读写操作是阻塞式的,而Java NIO则支持面向缓冲区的(Buffer-oriented)、基于通道的(Channel-based)I/O操作,读写操作是非阻塞的。Java NIO的引入旨在提高网络和文件I/O的性能。不同于流I/O,NIO允许用户指定何时开始I/O操作,何时结束,以及在什么条件下进行,提供了一种“选择就绪”的I/O操作模式。

weixin_34718952的博客 903

ByteBuffer 使用

ByteBuffer

prcyang的专栏 2121

MATLAB 2022b 用户专属:保姆级IPOPT求解器安装配置全流程(含OPTI工具箱)

本文为MATLAB 2022b用户提供IPOPT求解器的详细安装与配置指南,涵盖OPTI工具箱的适配安装、环境变量设置及常见问题解决方案。通过实战案例演示非线性优化问题的求解过程,帮助用户高效部署这一强大的优化工具,提升工程计算效率。

weixin_29092031的博客 405

ByteBuffer

在NIO中,数据的读写操作始终是与缓冲区相关联的.读取时信道(SocketChannel)将数据读入缓冲区,写入时首先要将发送的数据按顺序填入缓冲区.缓冲区是定长的,基本上它只是一个列表,它的所有元素都是基本数据类型.ByteBuffer是最常用的缓冲区,它提供了读写其他数据类型的方法,且信道的读写方法只接收ByteBuffer.因此ByteBuffer的用法是有必要牢固掌握的. 1.创建Byt

薄荷的专栏 992

ChatGPT Windows桌面版:从安全下载到高效配置的全流程指南

WebView封装技术是将网页应用转化为独立桌面程序的核心方法,它通过嵌入浏览器内核实现跨平台功能复用。其原理在于利用Electron或Tauri等框架,将Web内容打包进原生应用外壳,同时注入系统级API调用能力。这项技术的工程价值在于显著提升了Web应用的系统集成度和用户体验,使其能够支持全局快捷键、独立进程和本地数据存储等原生特性。在AI助手深度集成工作流的应用场景中,这种封装模式解决了浏览器多标签页切换繁琐、会话管理不便等痛点。本文以ChatGPT桌面客户端为例,详细解析了基于开源项目的安全下载路径

weixin_30437847的博客 484

电子元器件基础:电阻、电容、电感的特性与应用解析

本文深入解析了电子元器件中电阻、电容和电感三大基础元件的核心特性、工作原理与选型应用。电阻作为电路中的‘交通警察’,控制电流与分配电压,其额定功率与精度是关键选型参数。文章结合实战经验,详细阐述了它们在电源滤波、信号处理及高频电路中的不同表现与避坑指南,是电子设计与维修的必备基础知识。

weixin_29213655的博客 377

JAVA NIO缓冲区(Buffer)------ByteBuffer常用方法详解

缓冲区(Buffer)缓冲区(Buffer)就是在内存中预留指定大小的存储空间用来对输入/输出(I/O)的数据作临时存储,这部分预留的内存空间就叫做缓冲区:使用缓冲区有这么两个好处:1、减少实际的物理读写次数2、缓冲区在创建时就被分配内存,这块内存区域一直被重用,可以减少动态分配和回收内存的次数举个简单的例子,比如A地有1w块砖要搬到B地由于没有工具(缓冲区),我们一次只能搬一本,那么就要搬1w次...

沧海龙腾LV的博客 6万+

SPSS新手教程—两步聚类之结果解读

在《详解SPSS两步聚类之参数设置》一文中,我们已经了解了两步聚类的优点、分析原理,以及参数设置的技巧。 在本节中,会对IBM SPSS Statistics聚类后的结果进行解读,其中会涉及到最终聚类的结果、聚类的质量、变量重要性、聚类特征的解读。 如图1所示,我们先来回顾下本例数据在参数设置面板中的详细设置。 图1:二阶聚类设置 一、数值结果 根据上述参数设置,得到如下的数值分析结果。 首先看到自动聚类结果,如图2所示为聚类的透视表结果,展示了不同聚类数目下的BIC、BIC变化量、BIC变

nekonekoboom的博客 3万+

ByteBuffer常用方法详解

缓冲区(Buffer)就是在内存中预留指定大小的存储空间用来对输入/输出(I/O)的数据作临时存储,这部分预留的内存空间就叫做缓冲区: 使用缓冲区有这么两个好处: 1、减少实际的物理读写次数 2、缓冲区在创建时就被分配内存,这块内存区域一直被重用,可以减少动态分配和回收内存的次数 举个简单的例子,比如A地有1w块砖要搬到B地 由于没有工具(缓冲区),我们一次只能搬一本,那么就要搬1w次(

懒人的博客 8万+

caxa二次开发实例展示

本人有8年CAXA各产品(如电子图版、工艺图表、PDM等)二次开发经验,参与过国家电网南瑞集团、中石油、龙记集团、欧姆龙集团、港日集团、中集集团、中国五矿、方圆塑机、大连锅炉、金蝶PDM集成CAXA,TEAMCENTER集成CAXA、大连锅炉机械、中国中车等项目的开发,擅长CAXA电子图版、CAXA工艺图表的二次开发,有需要的可以联系我,电话:13169467685、13249738576 Q

hourui800720的专栏 8029

Coze智能体开发:工作流教程之解析文件概述

大模型本身并不具备文件读取和解析的能力,无法直接处理文件字节流。对于支持工具调用(Function calling)的模型,扣子提供插件功能来帮助大模型调用外部工具 API,拓展大模型的能力边界。扣子插件商店提供海量官方插件和第三方插件,例如链接读取插件可以将链接对应的文件内容解析为纯文本传递给大模型。

王国平的博客 1793

Java NIO系列教程(三) Buffer

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34356138的博客 510

【Windows Server 2019】活动目录 (Active Directory) ——理论

博文介绍了活动目录 (Active Directory) 的定义,作用以及与 DNS 的关系。同时也介绍了AD的组织结构,包括域控制器,子域,对象,属性,容器,组织单位,域间信任等术语的解释,实验拓扑图。

VMware, Windows, Linux, Cisco, Container, Kubernetes, Kali 7747

java.nio.ByteBuffer用法小结

文章目录简介初始化向ByteBuffer写数据手动写入数据从SocketChannel中读入数据至ByteBuffer从ByteBuffer中读数据复位position读取数据字节序处理 简介 在Java的Socket编程中,若使用阻塞式(BIO),则往往通过ServerSocket的accept()方法获取到客户端Socket之后,再使用客户端Socket的InputStream和OutputS...

水蓝城 7万+

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

NIO之ByteBuffer的使用

NIO之ByteBuffer的使用 NIO中有三大组件:Channel、Selector、Buffer,今天就来讲讲Buffer的使用。 Buffer的继承结构: Buffer为java中的每个数据类型都提供了对应的实现类,但是实际使用中用得最多的还是ByteBuffer。 ByteBuffer的创建 在堆上创建: log.info("freeMemory:{}MB", Runtime.getRuntime().freeMemory() / _1_MB); ByteBuffer allocate = By

morris 2万+

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

java nio ByteBuffer的使用

1、介绍 Buffer是nio包的一个抽象类,作为java nio的三大组件(Buffer、Channel,Selector)之一,在java nio网络编程中尤为重要。 Buffer提供了一个字节缓冲区,配合Channel使用,可以从Channel中读取或写入数据。 2、结构 属性介绍 以ByteBuffer为例,其包括5个主要的属性:hb、position、limit、capacity、mark。 hb:ByteBuffer类有一个byte数组变量hb,此数组里面存放的就是实际的字节数据。 capaci

xiao_yu_gan的博客 3852

android 蓝牙通讯demo

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

Java NIO 总结: ByteBuffer类介绍

ByteBuffer是Java NIO包中的一个类,它实现了Buffer接口,是处理字节数据的基础类。ByteBuffer类提供了多种方法,用于读取和写入字节数据,以及管理缓冲区的状态。ByteBuffer类支持多种数据类型,包括字节、字符、短整型、整型、长整型、浮点型和双精度浮点型等。ByteBuffer内部使用一个字节数组(byte[])来存储数据,通过操作数组中的索引位置来实现数据的读写。ByteBuffer类提供了多种方法,用于读取和写入字节数据,以及管理缓冲区的状态。

码到三十五 1653

Java NIO ByteBuffer读取文件

FileChannel 和 ByteBuffer 从JDK1.4以后就提供java.nio的包,nio主要提供字节与字符的映射、内存映射文件和文件加锁机制 其中内存映射文件在读取大文件时可能会用上,因为内存映射不是直接把文件加载到JVM内存空间 而是借用操作系统对文件的读取,这经历了由当前Java态进入到操作系统内核态,再由操作系统读取文件, 并返回数据到当前Java态的过程。由Jav

影魔的专栏 2万+

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

上一篇文章我们介绍了最底层的 Buffer,那么这篇文章就要介绍下 Buffer 的【源码解析】Java NIO 包中的 Buffer上面就是 Buffer 的继承结构,当然 Buffer 的子类肯定不会只有这么点,比如下面的图:只不过上面图中就给了几个基本 Buffer 的实现类,可以看到几个重要的实现类都是ByteBuffer的子类,这几个实现类也是我们要介绍的重点,只不过这篇文章我们先介绍 ByteBuffer。

Jwasx的博客 1493

Java NIO ByteBuffer 使用方法

OnMessage//xxxxx以前只知道 NIO 里面大量用到了 ByteBuffer ,并没有仔细了解过,这次特意学习了一下,因为JDK自带的ByteBuffer 可以切换读写两种模式加上内置很多方法组合使用,有很多约定俗成的用法,稍不注意就有可能踩坑,这也是为什么Netty里面又基于 ByteBuffer 重新封装了ByteBuf类,就是因为 JDK 自带的太难用了Java 中的 ByteBuffer 是 java.nio 包中的核心类之一,属于 New I/O (NIO) 框架。

三劫散仙 1281

Java NIO ByteBuffer 详解

ByteBuffer 是 Buffer 的一个具体实现,专门用于存储和操作字节数据。它提供了高效的、基于内存的 I/O 数据处理方式。Buffer 类是构建 Java NIO 的基础,其中 ByteBuffer 类是 Buffer 子类中最受欢迎的。这是因为字节类型是最通用的类型。例如,我们可以在 JVM 中使用字节来组成其他非布尔基元类型。另外,我们可以使用字节在 JVM 和外部 I/O 设备之间传输数据。

学而时习之,不亦说乎?温故而知新,可以为师矣! 1760

JAVA NIO ByteBuffer详解

ByteBuffer 是 Java NIO 中常常使用的一个字节缓冲区类。合理的使用它可以进行高效的IO操作。 创建ByteBuffer 1)使用allocate()静态方法 ByteBufferbuffer=ByteBuffer.allocate(256); 以上代码为创建一个256字节的缓冲区。缓冲区创建后不可更改,如果想改变大小唯一的方法只有重新创建一...

aliuguangjin的博客 849

Java NIO ByteBuffer

文章目录NIO ByteBuffer1. 使用NIO进行文件读取所涉及的步骤:2. `mark`,`position`,`limit`,`capacity` 四者之间的关系3. flip()方法4. clear()方法5. compact()方法 NIO ByteBuffer 1. 使用NIO进行文件读取所涉及的步骤: 从FileInputStream对象获取到Channel对象 创建Buff...

superbeyone 419

NIO之ByteBuffer

聊聊ByteBuffer

爪哇岛咖啡种植农场 1336

【Java源码阅读系列44】深度解读Java NIO ByteBuffer 源码

Java NIO(New Input/Output)中的 ByteBuffer 是 Buffer 抽象类的具体子类,专门用于处理字节数据的高效读写。作为 NIO 的核心组件,ByteBuffer 支持堆内存(Heap)和直接内存(Direct)两种存储方式,广泛应用于网络通信、文件 IO 等场景。本文将结合源码,深入解析 ByteBuffer 的核心机制、关键方法及设计模式的应用。

专注Java和MySQL领域知识分享 1037
上一篇: vue笔记(三)vue路由
下一篇: HTTP(一)网络基础
gcc_front
博客等级 码龄9年 16粉丝 98原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值