Java NIO 详解(二)缓存区与Buffer

       在基本IO操作中所有操作都是直接已流的形式完成的,而在NIO中所有的操作都要使用缓存区处理,且所有的读写操作都是通过缓存区完成的。缓存区(Buffer)是一个线性的、有序的数据集,只能容纳某种特定的数据类型

    

        Buffer的基本操作

        java.nio.Buffer是一个抽象类,常见方法如下

 

public final int capacity()

返回此缓存区的容量

public final int limit()

返回此缓存区的限制

public final Buffer limit(int newLimit)

设置此缓存区的限制

public final int position()

返回缓存区的操作位置

public final Buffer flip()

重设缓存区,在写入之前调用,改变缓冲的指针

public final boolean hasRemaining()

判断当前位置和限制之间是否有内容

       

 

        各种数据类型的缓冲区类

java.nio.ByteBuffer

存储字节的Buffer

java.nio.IntBuffer

储存整形的Buffer

 

        更多参考api

    

        演示缓冲区的操作

    

import java.nio.IntBuffer;

public class IntBufferDemo01 {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		IntBuffer buf = IntBuffer.allocate(10);
		System.out.println("1、写入数据之前的position、limit和capacity");
		System.out.println(buf.position()+","+buf.limit()+","+buf.capacity());
		int[] temp ={1,3,5};
		buf.put(2);
		buf.put(temp);
		System.out.println("2、写入数据之后的position、limit和capacity");
		System.out.println(buf.position()+","+buf.limit()+","+buf.capacity());
		buf.flip();  //重设缓冲区     limit设置为position,position设置为0
		System.out.println("3、准备输出数据时的position、limit和capacity");
		System.out.println(buf.position()+","+buf.limit()+","+buf.capacity());
		System.out.println("缓冲区的内容:");
		while(buf.hasRemaining()){
			int x = buf.get();
			System.out.print(x+"、");
		}
	}
}

          输出:

   

1、写入数据之前的position、limit和capacity
0,10,10
2、写入数据之后的position、limit和capacity
4,10,10
3、准备输出数据时的position、limit和capacity
0,4,10
缓冲区的内容:
2、1、3、5、

   

  

        创建子缓冲区

        可以使用各个缓冲区的类的slice()方法从一个缓冲区中创建一个新的子缓冲区,子缓冲区与原缓冲区中的各个部分数据可以共享

    

import java.nio.IntBuffer;

public class IntBufferDemo02 {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		IntBuffer buf = IntBuffer.allocate(10);
		IntBuffer sub = null;
		for (int i = 0; i < 10; i++) {
			buf.put(2*i+1);
		}
		buf.position(2);
		buf.limit(6);
		sub = buf.slice();
		for (int i = 0; i < sub.capacity(); i++) {
			int temp = sub.get(i);
			sub.put(temp-1);
		}
		buf.flip();
		buf.limit(buf.capacity());
		System.out.println("主缓存区中的内容");
		while(buf.hasRemaining()){
			int x = buf.get();
			System.out.print(x+"、");
		}
	}

}

        输出: 

    

主缓存区中的内容
1、3、4、6、8、10、13、15、17、19、

 

 

       创建直接缓冲区

       在缓冲区操作类中,只有ByteBuffer可以创建直接缓冲区,使用直接缓冲区的时候,JVM虚拟机会直接在此缓冲区上执行 本机IO操作,也就是说,在每次调用基础操作系统的一个本机IO之前或者之后,虚拟机都会避免将缓冲区的内容复制到中间缓冲区(或者从中间缓冲区复制内容)。

       创建直接缓冲区方法如下:

      

public static ByteBuffer allocateDirect(int capacity)

     

    

import java.nio.ByteBuffer;

public class ByteBufferDemo01 {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		ByteBuffer buf = null;
		buf = ByteBuffer.allocate(10);
		byte[] temp ={1,3,5,7,9};
		buf.put(temp);
		buf.flip();
		System.out.println("缓冲区的内容:");
		while(buf.hasRemaining()){
			int x = buf.get();
			System.out.print(x+"、");
		}
	}

}

        输出:

缓冲区的内容:
1、3、5、7、9、

 

   

 

通俗编程——白话NIO之Buffer Buffer简介Buffer意为缓冲区,其本质上就是是一块可写入数据,然后可以从中读取数据的内存区域,通过该种方式有助于减少系统开销和提高外设效率。 阅读详情

相关推荐

别再怕非观测区了!手把手教你用移相法搞定PMSM单电阻FOC的电流重构难题

本文详细解析了永磁同步电机(PMSM)单电阻FOC系统中非观测区的电流重构难题,重点介绍了移相法的工程实践。通过STM32平台的具体实现和调试指南,帮助工程师有效解决相电流检测中的采样窗口不足问题,提升系统稳定性和性能。

weixin_27252001的博客 434

二、NIO 中 缓存区(Buffer)的数据存取

package com.stu.buffer; import org.junit.Test; import java.nio.ByteBuffer; /** * 一、缓存区(Buffer):在 Java NIO 中负责数据的存取.缓存区就是数组。用于存储不同的数据类型的数据。 * * 根据数据类型不同(boolean除外),提供了相对应的缓存区。 * ByteBuffer * CharBuffer * ShortBuffer * I...

这天有点热的博客 251

ZedBoard+Vivado(二)——PS + PL实现流水灯

硬件:Zedboard 软件:Vivado2018.2 + Win10 本文参考了http://blog.chinaaet.com/cuter521/p/35978的设计 1 设计 功能:PS + PL流水灯 语言:C 流程:创建工程-&amp;gt;IP Integrator-&amp;gt;综合、实现、生成Bitstream-&amp;gt;SDK 2 流程 2.1 创建工程 跟上一篇步骤完全相同,这里不用添加源文...

q416524389的博客 3695

NIO入门 - 缓存与映射

NIO归根结底就是使用通道的缓存与映射,以实现输入源与输出源的操作简化。 此篇不涉及Web端的NIO开发(选择器/就绪加载/管道) 要想理解NIO的缓存机制,就必须要了解三个参数: 参数 含义 capacity 缓冲区数组的总长度 position 下一个要操作的数据元素的位置 limit 缓冲区数组中限制长度的下一个位置:limit&amp;lt;=capacity 而通道本...

taotaojs的博客 297

避开这些坑!用Python ReportLab生成PDF时字体处理与中文排版的5个关键技巧

本文针对Python ReportLab库在PDF自动化生成中常见的中文排版难题,提供了五个关键技巧。内容涵盖字体注册的稳健策略、段落样式的精细控制、表格内中文的换行对齐、页面布局管理以及性能优化,旨在帮助开发者彻底解决中文乱码、排版错位等问题,生成专业美观的PDF文档。

weixin_29250403的博客 624

深入解析 TDA4VM/VH R5F 核中断机制:VIC 与非 VIC 模式下的实战对比与优化

本文深入解析了TI TDA4VM/VH平台中ARMv7-R架构R5F核的两种中断处理机制:VIC模式与非VIC模式。通过对比硬件自动跳转与软件向量表分发的核心流程、实战代码示例及性能差异,为开发者提供了基于实时性、灵活性与调试需求的选择指南和优化建议,帮助构建更稳定的嵌入式系统。

weixin_29159441的博客 98

NIO学习-02缓存

 缓冲区:        一个用于特定基本数据类型的容器。由 java.nio 包定义的,所有缓冲区都是 Buffer 抽象类的子类。         Java NIO 中的 Buffer 主要用于与 NIO 通道进行交互,数据是从通道读入缓冲区,从缓冲区写入通道中的。  Buffer 就像一个数组,可以保存多个相同类型的数据。根据数据类型不同(boolean 除外) ,有以下 Buffer...

喝醉的咕咕鸟 382

软件需求规格说明书(SRS)深入解析

摘要: SRS(软件需求规格说明书)是定义系统功能、性能与接口的核心文档,为开发、测试、项目管理提供依据。标准结构包括引言、总体描述、功能/非功能需求、接口等模块。撰写需确保清晰、可验证、无歧义,避免模糊术语。示例展示学生注册模块的需求写法,强调性能与安全性要求。推荐使用Confluence、StarUML等工具辅助编写,交付时需包含主文档、原型图及需求跟踪矩阵。SRS应兼具技术性与管理性,作为沟通桥梁和验收标准。

moton2017的博客 2931

【NIO】Buffer(缓冲区)

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

yhl_jxy的博客 3934

英伟达 Jetson AGX Thor 官方入门教程(一)系统U盘安装

NVIDIA Jetson AGX Thor开发套件快速安装指南 本指南详细介绍了NVIDIA Jetson AGX Thor开发套件的安装流程。该套件搭载T5000 SoM,为物理AI和机器人应用提供强大支持。安装过程采用全新的JetPack 7.0方案,通过USB闪存盘即可完成BSP(Jetson Linux)安装,无需依赖Ubuntu主机。指南包含硬件开箱说明、两种配置模式(带显示器/无显示器)、详细的ISO镜像下载和USB制作步骤(推荐使用Balena Etcher工具),以及首次启动后的初始设置流

机器人控制与仿真应用 2869

AUTOSAR 3万字面试题全面解析(持续更新)

ECU抽象层(EAL)是AUTOSAR架构中的一部分,它位于微控制器抽象层(MCAL)之下,但通常与MCAL一起被提及。EAL的目标是提供一个统一的接口来访问和管理ECU(Electronic Control Unit,电子控制单元)的硬件资源,包括处理器、存储器和外围设备。通过这种抽象,EAL使得上层软件能够以一种标准化的方式与ECU硬件交互,而不需要关心具体的硬件实现细节。EAL解决了硬件异构性带来的问题,即不同ECU可能采用不同类型的处理器和硬件配置。

大模型大数据攻城狮的专栏 5611

Java NIO——直接缓存和非直接缓存

1.非直接缓存区: 通过allocate()方法分配的缓存区,将缓存区建立在JVM的内存中 2.直接缓存区: 通过allocateDirect()方法分配直接缓存区,将缓存区建立在物理内存中,可以提高效率,但是消耗的内存非常大,并且只有在程序的垃圾回收机制去回收,所以对于映射文件的操控性极差 3.文档讲解: 4.代码示例: @Test public void test3(...

qq_38386085的博客 1236

第38节:cesium 风场效果(含源码+视频)

cesium 风场效果

qq_29384639的博客 2331

Java NIO详解

JAVA NIO 简介 NIO与IO的对比

代码充实生活的博客 1万+

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

NIO中Buffer的各种方法详解及其作用

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

WhiteBear的博客 5789

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

【NIO】缓存区buffer

io中包含了很多东西,我个人认为最核心的是selector,那里我会使用大量的篇幅去介绍。但在那之前,我们还是从最简单的东西入手。今天只讲一下buffer。 在没有使用nio之前,我们只能自己维护一个byte数组或者是char数组来进行批量读写,或者使用BufferedReader,BufferedInputStream来做读写缓冲。在nio里,就可以使用buffer了。学习使用这个buffer要有点耐心,彻底了解它的机制再去用,这玩意的设计不是很友好。我在第一次用的时候,也是发现它的接口各种不符合期望,只

LoveSummer 1602

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Java NIO 详解

前言 本篇将分为BIO、NIO概念介绍、javaNIO组件、并发NIO简易模型实例三部分组成,为读者和我自己增加对NIO的理解。 一、概念认知 这里主要是介绍NIO,但是在介绍NIO的时候难免会提到BIO,所以这里也顺带介绍一下什么是BIO,由此切入NIO。 1 什么是IO 在介绍BIO之前先来了解一下更加普遍的概念IO,IO是输入流和输出流的统称,在IO的世界里,有几个重要的概念,分别是同步、异步、阻塞、非阻塞,在这一小部分主要也是介绍这四个的概念。 同步与异步 同步异步中有一个主线程的概念问题,就是当前

Burnup_110的博客 3290

Java Nio 的Buffer和优缺点

在数据传输的时候,我们会用到缓冲区。Java NIO中的Buffer用于和NIO通道进行交互。

WSYW126的博客 3601

Java NIO-Buffer

1 概述 Java NIO中的Buffer用于和NIO通道进行交互。数据是从通道进入缓冲区,从缓冲区写入通道中的。缓冲区本质上是一块可以写入数据,然后可以从中读取数据的内存。这块内存被包装成了NIO Buffer对象。在NIO中所有的数据都是用缓冲区处理的。 2 Buffer 使用Buffer一般步骤: 第一步:写入数据到Buffer 第二步:调用flip() 第三步:从Buffer中读取数据 第四步:调用clear()或者compact方法 注意:读取数据时,需要调用flip()方法将

爪哇人的博客 1159

Java NIO学习笔记二(Buffer的flip()方法详解)

flip()反转Buffer,将Buffer从读状态反转到写的状态

拿笔小星的博客 2万+

java 缓存区_Java NIO--基础理论之缓存区

1、概述:NIO我的理解就是 New IO,是API1.4里提供的新的API,为所有的原始类型做缓存支持。NIO主要的核心组成部分:Buffer(缓存)Channels(通道)Selectors(选择器)2、缓存区描述:一个用于特定基本类型数据的容器。缓冲区是特定基本类型(除了布尔型)元素的线性有限序列。除了内容之外,缓存区还具有容量、位置和界限。容量:是缓存区所包含的元素的数量。缓冲区的容量不能...

weixin_39983223的博客 213

Java NIO全面详解

NIO 中的 N 可以理解为 Non-blocking,不单纯是 New,是解决高并发、I/O高性能的有效方式。Java NIO是Java1.4之后推出来的一套IO接口,NIO提供了一种完全不同的操作方式, NIO支持面向缓冲区的、基于通道的IO操作。新增了许多用于处理输入输出的类,这些类都被放在java.nio包及子包下,并且对原java.io包中的很多类进行改写,新增了满足NIO的功能。

qq_32907491的博客 1228

java nio 缺陷_详解 Java NIO

文件的抽象化表示,字节流以及字符流的文件操作等属于传统 IO 的相关内容,我们已经在前面的文章进行了较为深刻的学习了。但是传统的 IO 流还是有很多缺陷的,尤其它的阻塞性加上磁盘读写本来就慢,会导致 CPU 使用效率大大降低。所以,jdk 1.4 发布了 NIO 包,NIO 的文件读写设计颠覆了传统 IO 的设计,采用『通道』+『缓存区』使得新式的 IO 操作直接面向缓存区,并且是非阻塞的,对于效...

weixin_29052717的博客 845

Java NIO之Buffer

Java NIO中的Buffer用于和NIO通道进行交互。数据是从通道读入缓冲区,从缓冲区写入到通道中的。缓冲区本质上是一块固定大小的内存,其作用是一个存储器或运输器。这块内存被包装成NIO Buffer对象,并提供了一组方法,用来方便的访问该块内存。 1、缓冲区基础 理论上,Buffer是经过包装后的数组,而Buffer提供了一组通用api对这个数组进行操作。 1.1、属性: 容量(Capacity) 缓冲区能够容纳的数据元素的最大数量。这一容量在缓冲区创建时被设定,并且永远不能被改变。 上界

sunyang098的博客 413

Buffer类,缓存区

1. Buffer概述 1).java.nio.Buffer(抽象类):从JDK4开始,JDK开始提供了NIO包。用于特定“原始类型的数据”的容器。它内部封装了某种“基本类型的数组”。 在之前使用IO流的时候,很多时候都是结合byte[]数组使用的。从NIO开始,到AIO,内部全部改用Buffer。 所以:Buffer就是代替之前的”byte[]”数组的。 2).Buffer的常用子类: 1...

JAVA大猩猩的博客 422
上一篇: Java NIO 详解(一)
下一篇: mybatis 空值配置
「已注销」
博客等级 码龄16年 3粉丝 37原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值