NIO - MappedByteBuffer

MappedByteBuffer 详解(图解+秒懂+史上最全) 这里 作为 rocketmq 高可用、高并发中间件的原理、源码与实操的前置知识,以博文的方式: 给大家介绍一下 MappedByteBuffer。java nio中引入了一种基于MappedByteBuffer操作大文件的方式,其读写性能极高,本文会介绍其性能如此高的内部实现原理。 阅读详情

  *MappedByteBuffer的创建

  在FileChannel上调用map方法 返回一个MappedByteBuffer对象  

public MappedByteBuffer map(MapMode mode, long position, long size)
 
  MapMode  映射模式(MapMode 是FileChannel中的一个内部类) 有三个可选值

   1.READ_ONLY    只读映射模式

   2.READ_WRITE  读/写映射模式

   3.PRIVATE           通过put方法对MappedByteBuffer的修改   不会修改到磁盘文件  只是虚拟内存的修改

*MappedByteBuffer在父类ByteBuffer的基础上 新增的几个方法

   1.fore缓冲区在READ_WRITE模式下,此方法对缓冲区所做的内容更改强制写入文件
   2.load:将缓冲区的内容载入物理内存,并返回该缓冲区的引用
   3.isLoaded:判断缓冲区的内容是否在物理内存,如果在则返回true,否则返回false

private final static Charset charset = Charset.forName("GBK");  
	
	/**
	 * 读文件
	 * <br>------------------------------<br>
	 * @param path
	 * @return
	 * @throws IOException
	 */
	private static String read(String path) throws IOException {
		if (path == null || path.length() == 0) return null;
		FileInputStream fileInputStream =  new FileInputStream(path);
		FileChannel fileChannel =  fileInputStream.getChannel();
		MappedByteBuffer mappedByteBuffer = fileChannel.map(MapMode.READ_ONLY, 0, fileChannel.size());
		fileInputStream.close();
		fileChannel.close();
		String str = charset.decode(mappedByteBuffer).toString();
		mappedByteBuffer = null;
		return str;
	}
	
	/**
	 * 追加内容
	 * <br>------------------------------<br>
	 * @param path
	 * @param str
	 * @return
	 * @throws IOException
	 */
	private static MappedByteBuffer append(String path, String str) throws IOException {
		if (str == null || str.length() == 0) return null;
		RandomAccessFile randomAccessFile = new RandomAccessFile(path, "rw");
		FileChannel fileChannel = randomAccessFile.getChannel();
		byte[] bytes = str.getBytes();
		long size = fileChannel.size() + bytes.length;
		MappedByteBuffer mappedByteBuffer = fileChannel.map(MapMode.READ_WRITE, 0, size);
		fileChannel.close();
		randomAccessFile.close();
		
		int position = mappedByteBuffer.limit() - bytes.length;
		mappedByteBuffer.position(position);
		mappedByteBuffer.put(bytes);
		mappedByteBuffer.force();
		mappedByteBuffer.flip();
		return mappedByteBuffer;
	}
	
	/**
	 * 文件复制
	 * <br>------------------------------<br>
	 * @param srcfilePath
	 * @param targetPath
	 * @throws IOException 
	 */
	private static void copy(String srcfilePath, String targetPath) throws IOException { 
		File file = new File(targetPath);  
		if (!file.getParentFile().exists()) {  
			file.mkdirs();  
		}  
		RandomAccessFile inRandomAccessFile = new RandomAccessFile(srcfilePath, "r");
		FileChannel inFileChannel = inRandomAccessFile.getChannel();
		MappedByteBuffer inMappedByteBuffer = inFileChannel.map(MapMode.READ_ONLY, 0, inFileChannel.size());
		inRandomAccessFile.close();
		inFileChannel.close();
		
		RandomAccessFile outRandomAccessFile = new RandomAccessFile(targetPath, "rw");
		FileChannel outFileChannel = outRandomAccessFile.getChannel();
		MappedByteBuffer outMappedByteBuffer = outFileChannel.map(MapMode.READ_WRITE, 0, inMappedByteBuffer.capacity());
		outMappedByteBuffer.put(inMappedByteBuffer);
		outMappedByteBuffer.force();
		outRandomAccessFile.close();
		outFileChannel.close();
		outMappedByteBuffer.flip();
	}
	
	/**
	 * 不会更新到文件 只会更新虚拟内存 
	 * <br>------------------------------<br>
	 * @param path
	 * @param str
	 * @return
	 * @throws IOException
	 */
	private static MappedByteBuffer doTestPrivateMode(String path, String str) throws IOException {
		if (str == null || str.length() == 0) return null;
		RandomAccessFile randomAccessFile = new RandomAccessFile(path, "rw");
		FileChannel fileChannel = randomAccessFile.getChannel();
		byte[] bytes = str.getBytes();
		long size = fileChannel.size() + bytes.length;
		MappedByteBuffer mappedByteBuffer = fileChannel.map(MapMode.PRIVATE, 0, size);
		mappedByteBuffer.put(bytes);
		fileChannel.close();
		randomAccessFile.close();
		
		mappedByteBuffer.flip();
		System.out.println(charset.decode(mappedByteBuffer));
		return mappedByteBuffer;
	}


 

从‘最速控制’到代码:深入拆解韩京清ADRC中TD跟踪器的fhan函数(含Matlab/Simulink实例) 本文深入解析韩京清ADRC中的fhan函数,从理论到代码实现,详细拆解其在Matlab/Simulink中的应用。通过分析最速控制问题和非线性TD的连续形式,揭示fhan函数在信号处理和噪声抑制中的独特优势,并提供工程实践中的参数整定和优化技巧。 阅读详情

相关推荐

LTC3783 LED驱动控制器设计与效率优化详解

开关电源控制器是现代LED照明的核心器件,通过电流模式控制实现高效能量转换。其核心原理是通过采样电阻检测负载电流,配合误差放大器形成闭环调节,在汽车电子、显示背光等场景中确保±3%的电流精度。LTC3783作为典型代表,集成升压/降压-升压多拓扑支持,配合PWM调光技术可实现3000:1的无色偏调光范围。在工程实践中,需重点考量功率电感选型、MOSFET开关损耗与热管理设计,例如在38W功率方案中采用10μH/5A电感和4.5mΩ MOSFET可达成95%效率。该方案特别适用于需要应对9-36V宽输入电压波

weixin_36231030的博客 399

MappedByteBuffer内存(堆外)文件映射

在linux中tmpfs是一种可以把内存直接拿来当文件系统使用的一种技术,这一技术也是共享内存/mmap的实现基础。今天我们就来研究一下java中如何使用mmap。 从JDK 1.4版本开始,Java内存映射文件(Memory Mapped Files)就已经在java.nio包中,引入NIO后,Java IO已经相当快,而且内存映射文件提供了Java有可能达到的最快IO操作,这也是为什么那些高...

赶路人儿 4036

LangChain4j 开发

市场上主流的 Java 调用大模型的工具库有两种:LangChain4j 是一个 面向 Java 的开源框架,用于构建 基于大语言模型(LLMs) 的应用程序。它是 LangChain(Python 生态中非常流行的 LLM 应用框架)的 Java 实现,旨在让 Java 开发者能够轻松地集成和使用各种 LLM 服务,快速开发 智能聊天机器人、智能搜索、文档问答、Agent系统 等 AI 驱动的应用。官网文档:https://docs.langchain4j.dev/。引入依赖(JDK17 及以上): 构建

m0_62943934的博客 2794

理解 MappedByteBuffer 及其实现类 DirectByteBuffer

java nio (jdk1.4) 中引入了MappedByteBuffer,相比较之前java io 的BufferedReader,BufferedInputStream 操作大文件,性能得到了极大提升,下面理解一下性能得到提升的原因。 内存管理 在理解MappedByteBuffer之前,先看看计算机内存管理的几个术语: MMU:内存管理单元,CPU中独立的硬件。 物理内存:即内存条的内存空间。 虚拟内存:虚拟内存是计算机系统内存管理的一种技术。它使得应用程序认为它拥有连续可用的内存(一个连续完

yzh_1346983557的博客 3727

jemalloc实战:5分钟搞定C程序内存泄漏检测(附PDF报告生成技巧)

本文详细介绍了使用jemalloc的heap profiling功能快速检测C/C++程序内存泄漏的实战方法。通过预编译库和LD_PRELOAD注入,无需修改代码即可启动低开销剖析,并利用jeprof工具进行深度分析和生成可视化PDF报告,帮助开发者高效定位线上或开发环境中的内存问题。

i3j4k5的博客 225

NVIDIA 2025 Board Design Engineer 校招笔试全解析:从基础门电路到理想放大器设计

本文详细解析了NVIDIA 2025届板级设计工程师校招笔试的核心考点与解题策略。内容涵盖从基础门电路、CMOS实现NOR门,到开关电源CCM/DCM模式波形分析与效率计算,以及理想运放电路设计与稳定性优化。旨在帮助考生构建硬件知识体系,掌握工程思维,顺利通过NVIDIA Board Design Engineer校招笔试。

weixin_29172201的博客 195

Java NIO教程 MappedByteBuffer

之前跟大家说过,要讲MappedByteBuffer,现在我来履行承诺了。 首先从大体上讲一下MappedByteBuffer究竟是什么。从继承结构上来讲,MappedByteBuffer继承自ByteBuffer,所以ByteBuffer有的能力它全有;像变动position和limit指针啦、包装一个其他种类Buffer的视图啦,都可以。“MappedByteBuffer”为何而来?吾辈

z69183787的专栏 6785

中国30米分辨率城市建成区数据集 (1972-2023年)

全国城市建成区空间分布数据(1972-2023年),利用Google Earth Engine平台,基于Landsat系列遥感影像提取了1972–2023年城市不透水面,后经过不透水面聚集密度计算方法计算了不透水面聚集密度,通过阈值划分提取了城市建成区,并设置了建成区面积阈值,去除了噪点,获取了全国城市建成区空间分布数据集。该提取能准确刻画城市形态,提取精度高,保持了建成区的完整性。数据集包括41期数据,1972年,1978年,1985-2023年逐年,分辨率为30米,有栅格和矢量两种格式。

地球资源数据云的官方博客 5824

NIO之MappedByteBuffer的使用

NIO提供了MappedByteBuffer,可以让文件直接在内存(堆外内存)中进行修改,而如何同步到文件由NIO来完成。 下面我们来看看一个例子先创建一个文件1.txt,里面的内容为hello world 1hello word! 编写一个程序对文件内容进行修改public abstract MappedByteBuffer map(MapMode mode, long po...

weixin_42869856的博客 378

使用ArcGIS Pro进行土地利用分类的机器学习与深度学习

传统的土地利用分类方法通常依赖于手动解译和规则定义,但随着机器学习和深度学习的发展,我们现在可以利用这些技术来自动化和提高分类的精度。ArcGIS Pro是一种功能强大的GIS软件,它提供了丰富的工具和功能,可以支持土地利用分类的机器学习和深度学习。我们将首先讨论数据准备和预处理的步骤,然后介绍常用的机器学习和深度学习方法,并提供相应的源代码示例。这可以通过人工标注或半自动的方式完成。数据裁剪:根据研究区域的范围,裁剪遥感影像数据,以减少计算和存储的负担,并确保只包含感兴趣的土地利用区域。

code_program481的博客 2039

YOLOv8改进,YOLOv8主干网络替换为ShuffleNetV2

ShuffleNet V2的设计原则:1.减少内存访问成本:通过优化数据传输路径,减少内存访问延迟,提高整体运算速度。2.考虑平台特性:针对不同硬件平台的特性进行优化设计,确保在目标平台上的高效运行。3.结构简洁高效:采用简洁而高效的模块设计,降低计算复杂度,同时保持或提升模型的预测准确性。下图,以四种不同计算复杂度水平下的准确性(在ImageNet验证集上的分类),速度和FLOPs的测量结果。(a, c) 为GPU结果,批量大小为8。(b, d) 为ARM结果,批量大小为1。

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 1565

java NIO之MappedByteBuffer

简书 占小狼前言java io操作中通常采用BufferedReader,BufferedInputStream等带缓冲的IO类处理大文件,不过java nio中引入了一种基于MappedByteBuffer操作大文件的方式,其读写性能极高,本文会介绍其性能如此高的内部实现原理。内存管理在深入MappedByteBuffer之前,先看看计算机内存管理的几个术语:MMC:CPU的内存管理单元。物理内...

lzf的博客 1270

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

java nio 之MappedByteBuffer

转载自:[url]http://blog.youkuaiyun.com/mgoann/article/details/3345850[/url] 其实掌握MappedByteBuffer并不难,只要记住“三方三法三特性”(我自己总结的,呵呵~~不要扔鸡蛋哦。。。)这句话就可以轻松搞定!MappedByteBuffer 只是一种特殊的 ByteBuffer ,即是ByteBuffer的子类。 Mapped...

见证我的成长 260

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

NIO 之 MappedByteBuffer

可参考: MappedByteBuffer以及ByteBufer的底层原理 概述 Bytebuffer分为两种:间接地和直接的,所谓直接就是指MappedByteBuffer,直接使用内存映射(java的话就意味着在JVM之外分配虚拟地址空间);而间接的ByteBuffer是在JVM的堆上面的。间接缓冲区就是我们通常说的堆缓冲区。 直接缓冲区 java内部是使用 DirectByteBu...

jijianshuai的专栏 2447

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

NIO中的MappedByteBuffer使用

MappedByteBuffer 可让文件直接在内存(堆外内存)修改, 操作系统不需要拷贝一次,提高性能。 import java.io.RandomAccessFile; import java.nio.MappedByteBuffer; import java.nio.channels.FileChannel; /* 说明 1. MappedByteBuffer 可让文件直接在内存(堆外内存)修改, 操作系统不需要拷贝一次 */ public class MappedByteBufferTest {

qq_22744093的博客 508

java nio MappedByteBuffer源码分析

目录 简介 字段fd,2个构造函数 方法checkMapped,mappingOffset,mappingAddress,mappingLength,isLoaded 字段unused,方法load,force,isLoaded0,load0,force0 简介 package java.nio; import java.io.FileDescriptor; import sun.misc.Unsafe; /** * 一种直接字节缓冲区,其内容是文件的内存映射区域。 * * &lt

今天吃了吗的博客 495

NIO与Socket笔记 :MappedByteBuffer

java io操作中通常采用BufferedReader,BufferedInputStream等带缓冲的IO类处理大文件,不过java nio中引入了一种基于MappedByteBuffer操作大文件的方式,其读写性能极高。 MappedByteBuffer map(FileChannel.MapMode mode, long position, long size)方法的作 用是将此通道的文...

张伯毅的专栏 2054

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

上一篇文章我们介绍了 HeapByteBuffer 的源码,这篇文章我们来介绍下 MappedByteBuffer,这个 MappedByteBuffer 是 DirectByteBuffer 的父类。【源码解析】Java NIO 包中的 Buffer【源码解析】Java NIO 包中的 ByteBuffer【源码解析】Java NIO 包中的 HeapByteBuffer。

Jwasx的博客 1360

【Java NIO】— 深入分析堆外内存 DirectByteBuffer & MappedByteBuffer

作者简介:大家好,我是码炫码哥,前中兴通讯、美团架构师,现任某互联网公司CTO,兼职码炫课堂主讲源码系列专题代表作:《jdk源码&多线程&高并发》,《深入tomcat源码解析》,《深入netty源码解析》,《深入dubbo源码解析》,《深入springboot源码解析》,《深入spring源码解析》,《深入redis源码解析》等联系qq:184480602,加我进群,大家一起学习,一起进步,一起对抗互联网寒冬。

smart_an的专栏 1305

深入浅出java.nio.MappedByteBuffer

深入浅出java.nio.MappedByteBuffer

CERTAINTY的博客 535

Java NIO之大文件缓存MappedByteBuffer详解

定义: FileChannel是Java NIO对应于磁盘等存储设备文件操作的通道。 常用API详解: 获取FileChannel的API /** * 打开一个与文件的连接通道,用于进行文件操作。 * path:path,文件的路径对象,可用Path.get("文件路径"),获取。 * options:通道的操作参数。通常使用实现类枚举StandardOpenOption指定。 * attrs:创建文件时自动设置的文件属性的可选列表,比如读写执行。 */ public static FileChanne

lixinkuan的博客 1998
上一篇: NIO - Scatter/Gather
下一篇: ibatis源码浅析- 初探
胸口碎大石_
博客等级 码龄17年 1154粉丝 82原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值