FileChannel、ByteBuffer对文件操作过程对比

第一章Netty,FileChannel结合ByteBuffer进行读写 本文提供了使用FileChannel和ByteBuffer进行标准文件读写的完整示例,展示了中小文件处理的通用方法。示例包含写入字符串到文件和读取验证两个关键流程,重点演示了ByteBuffer的flip()状态切换和资源管理。技术要点包括:1)通过StandardOpenOption配置通道模式;2)写入时必须先flip()切换Buffer为读模式;3)读取后同样需要flip()才能读取数据;4)使用try-with-resources自动管理资源。相比前文讨论的大文件内存映射方案,这种标准模式更适用于常 阅读详情

#内存映射文件#

文章背景:对文件进行MD5操作时获取到文件的途径多样及处理方式略有不同,博主经过对比希望得出较为合理的方式。

FileChannel:用于读取、写入、映射和操作文件的通道。 (以下解释源自JavaAPI文档)

文件通道在其文件中有一个当前 position,可对其进行查询和修改。该文件本身包含一个可读写的长度可变的字节序列,并且可以查询该文件的当前大小。写入的字节超出文件的当前大小时,则增加文件的大小;截取 该文件时,则减小文件的大小。文件可能还有某个相关联的元数据,如访问权限、内容类型和最后的修改时间;此类未定义访问元数据的方法。

除了字节通道中常见的读取、写入和关闭操作外,此类还定义了下列特定于文件的操作:

以不影响通道当前位置的方式,对文件中绝对位置的字节进行读取或写入。

将文件中的某个区域直接映射到内存中;对于较大的文件,这通常比调用普通的 read 或 write 方法更为高效。

强制对底层存储设备进行文件的更新,确保在系统崩溃时不丢失数据。

以一种可被很多操作系统优化为直接向文件系统缓存发送或从中读取的高速传输方法,将字节从文件传输到某个其他通道中,反之亦然。

可以锁定某个文件区域,以阻止其他程序对其进行访问。

--------------------------------------------------------------------------------------------

FileChannel 类的map方法可以从该通道中获得一个ByteBuffer (指定映射的文件区域及映射模式)

FileChannel.MapMode.READ_ONLY    产生只读的缓冲区 (下文例子过程中得以体现)

FileChannel.MapMode.READ_WRITE   产生可写的缓冲区 (可影响文件内容)

FileChannel.MapMode.PRIVATE            产生可写的缓冲区 但不会影响传至文件


=====================================================

ByteBuffer:字节缓冲区。  (本文目的不在于详细解释类 故不再介绍方法)

此类针对字节缓冲区定义了以下六类操作:

读写单个字节的绝对和相对 get 和 put 方法;

将此缓冲区的连续字节序列传输到数组中的相对批量 get 方法;

将 byte 数组或其他字节缓冲区中的连续字节序列传输到此缓冲区的相对批量 put 方法;

读写其他基本类型值,并按照特定的字节顺序在字节序列之间转换这些值的绝对和相对 get 和 put 方法;

创建视图缓冲区 的方法,这些方法允许将字节缓冲区视为包含其他基本类型值的缓冲区;

对字节缓冲区进行 compacting、duplicating 和 slicing 的方法。

字节缓冲区可以通过 allocate 方法创建,此方法为该缓冲区的内容分配空间,或通过 wrapping 方法将现有的 byte 数组包装到缓冲区中来创建。

---------------------------------------------------------------------------------------------

ByteBuffer 的创建需要以allocate来指定分配的缓冲区大小 

=====================================================

实验开始:

文件素材:D:\JAVA3D.zip   21.7MB  D:\MyRecord.txt 16bit

import java.io.File; 
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.math.BigInteger;
import java.nio.ByteBuffer;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel;
import java.nio.charset.Charset;
import java.security.DigestInputStream;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

/*消息摘要算法相关内容
 * 
 * */
public class MessageDigestTest {

	public static void Test2() throws NoSuchAlgorithmException{
		File myFile=null;
		FileChannel fc=null;
		try {
			 myFile =new File("D:\\JAVA3D.zip");
			 fc = new FileInputStream(myFile).getChannel();
		ByteBuffer byteBuffer=ByteBuffer.allocate((int)myFile.length());
		try {
			fc.read(byteBuffer);
			
			MessageDigest sha=MessageDigest.getInstance("MD5");
				String stt=new BigInteger(1,sha.digest(byteBuffer.array())).toString(16);
				System.out.println(stt);
			
		} catch (IOException e) {
			e.printStackTrace();
		}
		
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		}finally {
			if(fc!=null){
				try {
					fc.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
		
	}
	public static void Test3() throws NoSuchAlgorithmException{
		File myFile=null;
		FileChannel fc=null;
		try {
			 myFile =new File("D:\\JAVA3D.zip");
			 fc = new FileInputStream(myFile).getChannel();
		ByteBuffer byteBuffer=ByteBuffer.allocate(1024);
		int len;
		try {
			MessageDigest sha=MessageDigest.getInstance("MD5");
			while((len=fc.read(byteBuffer))>0)
			{ sha.update(byteBuffer.array(), 0, len);
			  byteBuffer.flip();
			  byteBuffer.clear();
			}
                 String stt=new BigInteger(1,sha.digest()).toString(16);
				System.out.println(stt);
			
		} catch (IOException e) {
			e.printStackTrace();
		}
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		}finally {
			if(fc!=null){
				try {
					fc.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
		
	}
	public static void Test4() throws NoSuchAlgorithmException{
		FileChannel fc=null;
		try {
			 fc=new FileInputStream("D:\\JAVA3D.zip").getChannel();
			 try {
				int length=(int)fc.size();
				 MappedByteBuffer mbbf=fc.map(FileChannel.MapMode.READ_ONLY, 0, length);
				 MessageDigest sha=MessageDigest.getInstance("MD5");
				 sha.update(mbbf);
				 String stt=new BigInteger(1,sha.digest()).toString(16);
				 System.out.println(stt);
				 
			} catch (IOException e) {
				e.printStackTrace();
			}
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		}finally {
			if(fc!=null){
				try {
					fc.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
	}
	public static void main(String[] args) throws NoSuchAlgorithmException {
		long begin=System.currentTimeMillis();
		Test2();
		long end=System.currentTimeMillis();
		System.out.println((end-begin)+" ms");
	}

}

输出结果如下: (由于程序代码执行牵扯内存占用问题,每次执行数据间隔会有些许偏差)
D:\JAVA3D.zip  组 

1.Test3()中 指定ByteBuffer大小为1024  Test2()中为文件大小
5417f2fe5eafc7b531a91ed391dbec89
423 ms
5417f2fe5eafc7b531a91ed391dbec89
539 ms
5417f2fe5eafc7b531a91ed391dbec89
372 ms
-------------------------------------分析:Test4<Test2<Test3   T3中利用循环读取,虽然缓冲内存小了但执行次数加大
2.Test3()中 指定ByteBuffer大小为5120  Test2()中为文件大小
5417f2fe5eafc7b531a91ed391dbec89
424 ms
5417f2fe5eafc7b531a91ed391dbec89
417 ms
5417f2fe5eafc7b531a91ed391dbec89
358 ms
-------------------------------------分析:Test4<Test3<Test2   T3中加大了缓冲空间,减小了循环次数,但终不如T4
D:\MyRecord.txt  组 
Test3()中 指定ByteBuffer大小为1024  Test2()中为文件大小
d063036c28b1dd869ffedb2e924b6f88
55 ms
d063036c28b1dd869ffedb2e924b6f88
57 ms
d063036c28b1dd869ffedb2e924b6f88
59 ms

-------------------------------------分析:由于文件大小仅为16字节,三者基本等同  

总结:使用内存映射进行读取文件,执行效果可观,有良好效益。

本例只是简单介绍两者的异同,若想提高效率,请继续阅读另外两篇,相信会有更多的收获(虽然后两篇以加密解密为主,但其中的执行方法的确是经过一些优化的,比直接简单读写要快)

“java证书加解密过程” : http://blog.youkuaiyun.com/only06/article/details/52090169

“java非证书下加解密小解析”: http://blog.youkuaiyun.com/only06/article/details/52014693


【Cadence】 ADS Dynamic Link使用教程 在Cadence617上使用ADS Dynamic Link 阅读详情

相关推荐

ε-差分隐私之拉普拉斯噪声机制(定义 + 证明 + 代码)

ε-差分隐私之拉普拉斯噪声机制 差分隐私的描述 1-范式的定义:使用matlab调用函数norm(x, 1) 更多范式见 范式 差分隐私的定义应该满足 拉普拉斯噪声的证明全过程如下: DP方向差分隐私证明是基本入门!!! -拉普拉斯噪声分布代码 Laplace分布的概率密度函数的形式是: 使用python - matplotlib来绘制概率分布图: import matplotlib.pyplot as plt import numpy as np def laplace_fun

毕业才是起点 1万+

Java NIO之通道FileChannel详解

定义: StandardOpenOption是一个枚举类,代表着文件连接时的标准选项。通常可以多个选项一起使用。 public enum StandardOpenOption implements OpenOption { /** * 以读的方式连接文件。 */ READ, /** * 以写的方式连接文件。 */ WRITE, /** * 以追加的方式连接文件,不会覆盖文件原本内容,在后面追加。 */ ...

lixinkuan的博客 2932

零基础搭建机械零件检测系统:基于YOLOv8的PySide6可视化开发全攻略

本文详细介绍了如何从零开始搭建基于YOLOv8的机械零件检测系统,涵盖环境配置、数据集准备、模型训练优化及PySide6可视化界面开发全流程。通过实战案例展示YOLOv8在工业检测中的高效应用,帮助开发者快速实现自动化零件检测解决方案。

weixin_28455801的博客 309

Java FileChannel文件的读写实例

文件通道FileChannel是用于读取,写入,文件的通道。FileChannel只能被InputStream、OutputStream、RandomAccessFile创建。使用fileChannel.transferTo()可以极大的提高文件的复制效率,他们读和写直接建立了通道,还能有效的避免文件过大导致内存溢出。

lovoo的博客 2353

【Get深一度】小波分析概念1——紧支撑集是什么意思,通俗解释

最近学到小波,在仿真中也用到了紧支撑函数;紧支撑性越好,说明能量越集中;用最通俗的话来讲,紧支撑是这样的: 对于函数f(x),如果自变量x在 0附近的取值范围内,f(x)能取到 C; 而在此之外,f(x)取值为 0; 那么这个函数f(x)就是紧支

Trey_优快云 的优快云博客 8348

告别C盘空间焦虑!Miniforge环境路径精准配置全攻略

本文深入解析Miniforge虚拟环境默认占用C盘空间的根本原因,即未正确配置`.condarc`文件中的`envs_dirs`路径优先级。通过详细的诊断步骤与配置命令,指导用户将环境路径精准迁移至指定磁盘(如D盘),并分享禁用自动激活、使用`--prefix`参数等高阶技巧,帮助开发者彻底告别C盘空间焦虑,实现虚拟环境的整洁与可控管理。

weixin_28831399的博客 238

FileChannel 与 ByteBuffer 操作文件

FileChannel 可由 RandomAccessFile、FileOutputStream 等 getChannel方法获取 RandomAccessFile raf = new RandomAccessFile("d://test.txt", "rws"); FileChannel channel = raf.getChannel(); ByteBuffer bb = ByteBuff

LUANJIESHI的专栏 1435

【Chipyard】Gemmini快速上手

Gemmini 加速器在 ResNet50 推理任务中表现出计算密集型优势,核心操作周期分布符合深度学习模型特征,推理预测流程完整且测试通过,为后续硬件优化和模型部署提供了有效参考。

2360

第14节FileChannel详解

经过前两篇文章的学习,相信对Channel有了一定的整体性认识。接下来通过学习本篇文章,更进一步认识Channel,学习FileChannel的细节 用途 特点 api 原理 一.用途 传统IO中的FileInputStream和FileOutputStream,相信读者都不陌生。在NIO中提供新的方式对文件进行I/O操作。 A channel for reading, writing, mapping, and manipulating a file. 上面的描述来自Java SE8中FileCh

pjh88的博客 894

TDS水质检测传感器原理图设计,已量产(液体传感器)

最近调试了一款针对生活用水、水培系统的 TDS 水质检测模块 —— 毕竟 TDS(总溶解固体)值直接关联水的洁净程度,是这类场景里既实用又易获取的水质指标。下面拆解下这个电路的设计逻辑,说说每个部分是怎么配合实现精准检测的。

不脱发的程序猿 1541

DRM全解析 —— encoder详解(3)

DRM全解析 —— encoder详解(3)

phmatthaus的专栏 491

流与文件(Java核心技术卷Ⅱ)

流与文件 1 流 2 文本输入与输出 3 读写二进制数据 4 ZIP文档 5 对象流与序列化 流与文件 1.1 流 抽象类InputStream和OutputStream构成了输入输出类层次结构的基础。 由于面向字节的流不便于处理Unicode形式存储的信息(Unicode每个字符都使用了多个字节表示),所以从抽象类Reader和Writer中继承出来了一个专门用于

rename_to的博客 1438

HFSS实战项目——GPS北斗双模微带天线

本文设计了一款方形圆极化微带天线应用于北斗B1和GPSL1频段,满足高增益、低VSWR、适当方向图等要求。设计中心频率为1568MHz,介质板采用厚度h=1.6mm的Arlon AD450(tm)板,相对介电常数为4.5,采用探针馈电。

2401_87464239的博客 1768

ByteBuffer与FileChannel学习笔记

ByteBuffer与FileChannel学习笔记 ps:今天看了很多博客学习了ByteBuffer和FileChannel,融合了其他大佬们的精华,整理成笔记。 首先我们来说说这两个类是什么: ByteBuffer类是在Java NIO中常常使用的一个缓冲区类,使用它可以进行高效的IO操作。 FileChannel就是连接到文件的管道。使用FileChannel,你可以读取文件数据,以...

weixin_42558056的博客 850

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

使用NIO的FileChannel和ByteBuffer高效读取文件

http://hi.baidu.com/boywell/blog/item/658d143f730a553770cf6ccd.html import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream;

afa的专栏 1万+

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

JAVA IO中的ByteBuffer, FileChannel

package com.yaeher.community.test.nio; import lombok.extern.slf4j.Slf4j; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.nio.ByteBuffer; import java.nio.CharBuffer; import java

weixin_41725862的博客 261

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

使用Java中的FileChannel和ByteBuffer在文件中读取/写入文件

过去,我讨论过RandomAccessFile以及如何将其用于在Java中进行更快的IO,在本Java NIO教程中,我们将了解如何通过使用FileChannel和ByteBuffer来使用读/写数据。 Channel提供了一种从文件读取数据的替代方法,它提供了比InputStream或OutputStream更好的性能。 也可以在阻止和非阻止模式下打开它。 尽管FileChannles...

最佳 Java 编程 2712

FileChannel 和 ByteBuffer 的使用

目录 1、存入文件 2、读取文件 3. 直接将数据从一个文件通道写入另一个文件通道 4. 直接内存 1、存入文件 下面给个例子,简单地把内容写入到指定文件中。 public class FileChannelTest { public static void main(String[] args){ try { // 先把字符串内容写入source.txt文件中 String message = "hello, h.

dgh112233的博客 2923

在Java中使用FileChannel和ByteBuffer对文件进行读写

过去,我讨论过RandomAccessFile以及如何将其用于在Java中进行更快的IO,在本Java NIO教程中,我们将了解如何通过使用FileChannel和ByteBuffer来使用读/写数据。 Channel提供了一种从文件读取数据的替代方法,它提供了比InputStream或OutputStream更好的性能。 也可以在阻止和非阻止模式下打开它。 虽然, FileChannl...

最佳 Java 编程 1206

文件的一些操作类File,RandomAccessFile,FileChannel,ByteBuffer,MMap

1.File File类主要用来操纵文件或者目录,new File()时只是创建了一个代表这个路径的File对象,但是这个路径对应的目录或者文件还没有创建,可以通过mkdirs()或者creatNewFile()进行创建。 import java.io.File; //目录的路径,相对路径,指project下面的路径 String path = "fileTest/data"; //文件的路...

chen_yuxi的博客 1118

java ByteBuffer;FileChannel;Files区别

【代码】java Buffer。

m0_59802969的博客 354

ByteBuffer Android

ByteBuffer是NIO里用得最多的Buffer,它包含两个实现方式:HeapByteBuffer是基于Java堆的实现,而DirectByteBuffer则使用了unsafe的API进行了堆外的实现。这里只说HeapByteBuffer。 在NIO中,数据的读写操作始终是与缓冲区相关联的.读取时信道(SocketChannel)将数据读入缓冲区,写入时首先要将发送的数据

zhuangyalei的专栏 4919

FileChannel原理

官方对Channel的解释 (一个用于输入/输出操作的连接。通道表示对实体的开放连接,如硬件设备、文件、网络套接字或能够执行一个或多个不同的输入/输出操作的程序组件,例如读取或写入。) Thanking In Java中的描述 Channel是对I/O操作的封装。 FileChannel配合着ByteBuffer,将读写的数据缓存到内存中,然后以批量/缓存的方式read/write,省去了非批量操作时的重复中间操作,操纵大文件时可以显著提高效率(和Stream以byte数组方式...

dodod2012的专栏 996

01-NIO基础之ByteBuffer和FileChannel

一、channel和buffer channel是用户通信的通道,buffer是缓冲区,再从channel读取数据之前,我们要先将数据读取到buffer中,再从buffer中取出来。再向channel写入数据之前,也是将数据写入buffer中,channel再从buffer中拿去数据。 常见的channel FileChannel SocketChannel ServerSocketChannel Buffer的种类有很多,最常用的便是ByteBuffer了 二、ByteBuffer ByteBuf

qq_42861526的博客 651

java filechannel优点_FileChannel指南

推荐关注公众号:锅外的大佬每日推送国外技术好文,帮助每位开发者更优秀地成长译者:Leesen1.概述在这篇速学教程中,我们将研究Java NIO库中提供的FileChannel类,讨论如何使用FileChannel和ByteBuffer读写数据,探讨使用FileChannel以及其他文件操作特性的优点。2.FileChannel的优点FileChannel的优点包括:在文件特定位置进行读写操作将文...

weixin_42134051的博客 1541

Netty——01(FileChannel和ByteBuffer)

目录标题一、IO多路复用的三种机制Select,Poll,Epoll 一、IO多路复用的三种机制Select,Poll,Epoll I/O多路复用(multiplexing)的本质是通过一种机制(系统内核缓冲I/O数据),让单个进程可以监视多个文件描述符,一旦某个描述符就绪(一般是读就绪或写就绪),能够通知程序进行相应的读写操作。 推荐看一下原文:[IO多路复用的三种机制Select,Poll,Epoll](https://www.jianshu.com/p/397449cadc9a) ...

a123123sdf的博客 440
下一篇: Java非证书下的加密解密过程小解析
JumpFly_W
博客等级 码龄17年 72粉丝 31原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值