Java 输入与输出之 NIO.2【AIO】【内存映射文件】【自动资源管理】探索之【四】

news2024/9/22 1:06:13

一,自动资源管理
Java 7 增加了一个新特性,该特性提供了另外一种管理资源的方式,这种方式能自动关闭文件等系统资源。这个特性又被称为自动资源管理(Automatic Resource Management, ARM), 该特性以 try 语句的扩展版为基础。自动资源管理主要用于,当不再需要文件(或其他资源)时,可以防止无意中忘记释放它们,从而防止内存泄漏的发生。
自动资源管理基于 try 语句的扩展形式,又称为“带资源的 try 语句”。
带资源的 try 语句的语法格式:
try(需要关闭的资源声明){
//可能发生异常的语句
}catch(异常类型 变量名){
//异常的处理语句
}finally{
//一定执行的语句
}

当try 代码块结束时,自动释放资源。因此不需要显式调用 close() 方法。该形式也称为“带资源的 try 语句” 。
注意:
①try 语句中声明的资源被隐式声明为 final ,资源的作用局限于带资源的 try 语句
②可以在一条 try 语句中声明和管理多个资源,每个资源以“;” 隔开即可。
③需要关闭的资源,必须实现了 AutoCloseable 接口或其自接口 Closeable

这是一个使用FileChannel进行文件复制的应用实例。
在Java 7以前,没有自动管理资源的try语句时,这个文件复制功能需要这样来实现:

    public static void copyFileOld(String file,String path){
    	FileChannel in = null;
    	FileChannel out = null;
    	try {
        	in = FileChannel.open(Paths.get(file), READ);
        	out = FileChannel.open(Paths.get(path), WRITE, CREATE);
    		//从in(Channel)将信息流转到out(Channel)
            in.transferTo(0, in.size(), out);
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				in.close();
				out.close();
			} catch (Exception e2) {
				// TODO: handle exception
			}
		}
    }

下面是一个使用FileChannel进行文件复制的应用实例,这个例程很好的说明了FileChannel就是一个双向的输入和输出流,在本例的文件拷贝中甚至不需要缓冲区Buffer。本例程同时演示了“带资源的 try 语句” 的用法。
JDK7 以后,有了“带资源的 try 语句”,我们可以写得很简明。

	//自动资源管理:自动关闭实现 AutoCloseable 接口的资源
    public static void copyFile(String file,String path){
        try(FileChannel in = FileChannel.open(Paths.get(file), READ);
            FileChannel out = FileChannel.open(Paths.get(path), WRITE, CREATE)){
        	//从in(Channel)将信息流转到out(Channel)
            in.transferTo(0, in.size(), out);
        }catch(IOException e){
            e.printStackTrace();
        }
    }

完整源代码
这里是完整的测试例程源代码:

package nio;
/***
 * @author QiuGen
 * @description  文件复制例程CopyFileNIO
 * 演示“带资源的 try 语句”用法和FileChannel的文件操作。
 * @date 2024/8/30
 * ***/
import java.io.IOException;
import java.nio.channels.FileChannel;
import java.nio.file.Paths;
import static java.nio.file.StandardOpenOption.*; 
public class CopyFileNIO {
	//以前没有自动关闭功能时的写法
    public static void copyFileOld(String file,String path){
    	FileChannel in = null;
    	FileChannel out = null;
    	try {
        	in = FileChannel.open(Paths.get(file), READ);
        	out = FileChannel.open(Paths.get(path), WRITE, CREATE);
    		//从in(Channel)将信息流转到out(Channel)
            in.transferTo(0, in.size(), out);
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				in.close();
				out.close();
			} catch (Exception e2) {
				// TODO: handle exception
			}
		}
    }

	//自动资源管理:自动关闭实现 AutoCloseable 接口的资源
    public static void copyFile(String file,String path){
        try(FileChannel in = FileChannel.open(Paths.get(file), READ);
            FileChannel out = FileChannel.open(Paths.get(path), WRITE, CREATE)){
        	//从in(Channel)将信息流转到out(Channel)
            in.transferTo(0, in.size(), out);
        }catch(IOException e){
            e.printStackTrace();
        }
    }

	public static void main(String[] args) {
    	String fileA = "D:/Temp/image/仿射变换.jpg";
    	String fileB = "D:/Temp/image/仿射变换2.jpg";
    	CopyFileNIO.copyFile(fileA, fileB);
	}
}

二、内存映射文件

文件操作的四大方法:
 前提:计算机内存的访问速度比磁盘高几个数量级,但是在Java语言中基本的IO操作都是直接调用native方法获得驱动和磁盘进行交互的,IO速度限制在磁盘速度上。

由此,就有了缓存的思想,将磁盘内容预先缓存在内存上,这样当需要IO操作读写数据信息的时候,IO速度基本就是以内存的访问速度为主,例如:缓冲型的输入/输出BufferedInput/OutputStream等。

而我们知道大多数操作系统都可以利用虚拟内存来实现将一个文件或者文件的一部分映射到内存中,这样文件就可以当作是内存文件一样快速进行访问,我们可以把它当作一种“内存文件”使用。

内存映射文件:内存映射文件允许我们创建和修改那些因为太大而不能放入内存的文件,此时就可以假定整个文件都放在内存中,而且可以完全把它当成非常大的内存文件来访问(随机访问)。
在这里插入图片描述当处理的大文件时,缓冲输入/输出方式和内存映射文件方式将有很大的优势。
处理大文件时,内存映射文件这个方式尤其在随机访问文件时能大幅提高性能,所以可用来替代RandomAccessFile。
  当然,对于中小尺寸文件的顺序读入则没有必要使用内存映射以避免占用本就有限的I/O资源,这时应当使用带缓冲的输入流。

Java NIO(New IO)是在JDK 1.4版本中引入的,它提供了一种基于缓冲区的IO操作方式,旨在提高IO操作的效率和性能。MappedByteBuffer是Java NIO中的一个重要类,它允许Java程序直接从内存访问文件,通过将整个文件或文件的一部分映射到内存中,操作系统负责处理页面请求和写入文件,从而实现了非常快速的IO操作。这种内存映射文件的方式不仅提供了高性能的文件读写能力,还支持多个进程同时访问,实现低时延的共享内存操作。因此,MappedByteBuffer的引入,使得Java应用程序在处理大文件或需要高性能IO操作的场景下有了更多的选择和灵活性。

MappedByteBuffer的一个能力就是它可以让我们读写那些因为太大而不能放进内存中的文件。有了它,我们就可以假定整个文件都放在内存中(实际上,大文件放在内存和虚拟内存中),基本上都可以将它当作一个特别大的数组来访问,这样极大的简化了对于大文件的修改等操作。
MappedByteBuffer底层使用的技术是内存映射。
说明
对大多数操作系统来说,做内存文件映射都是一个昂贵的操作。所以MappedByteBuffer适用于对大文件的读写。对于小文件直接用普通的读写就好了。

java.nio包使得内存映射变得更加简单。
 map过程
FileChannel提供了map方法把文件映射到虚拟内存,通常情况可以映射整个文件,如果文件比较大,可以进行分段映射。
1、首先,从文件中获得一个通道(channel)。通道是相当于双向的输入输出流,是对IO操作的一种抽象,它使我们可以进行内存映射,实现内存映射文件。
2、然后,通过调用FileChannel类的map方法进行内存映射,map方法从这个通道中获得一个MappedByteBuffer对象(ByteBuffer的子类),作为缓冲区,来存储文件数据信息。

FileChannelr的map方法可把文件影射为内存映像文件: MappedByteBuffer map(int mode,long position,long size); 可以把文件从position开始的size大小的区域映射为内存映像文件,mode指出了 可访问该内存映像文件的方式。
FileChannel中的几个变量
MapMode mode:内存映像文件访问的方式,共三种:
MapMode.READ_ONLY:只读,试图修改得到的缓冲区将导致抛出异常。
MapMode.READ_WRITE:读/写,对得到的缓冲区的更改最终将写入文件;但该更改对映射到同一文件的其他程序不一定是可见的。
MapMode.PRIVATE:私用,可读可写,但是修改的内容不会写入文件,只是缓冲区自身的改变,这种改变不会写回到文件中。

未完符续

Java输入输出系列的相关博客链接:
Java 输入与输出之 NIO.2【AIO】【Path、Paths、Files】【walkFileTree接口】探索之【三】

参考资料:
JAVA NIO学习四:Path&Paths&Files 学习
Java NIO 内存映射文件

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2091202.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

泛微E9开发 申请流程时,通过附件ID带出文件

申请流程时,通过附件ID带出文件 1、需求说明2、实现操作3、标准API知识-修改单个字段值(不支持附件类型)3.1.格式3.2.参数说明3.3.样例3.4.特别注意 1、需求说明 在用户申请流程表单的时候,需要用到系统中已经存在的文档&#xf…

MySQL-进阶篇-锁(全局锁、表级锁、行级锁)

文章目录 1. 锁概述2. 全局锁2.1 介绍2.2 数据备份2.3 使用全局锁造成的问题 3. 表级锁3.1 表锁3.1.1 语法3.1.2 读锁3.1.3 写锁3.1.4 读锁和写锁的区别 3.2 元数据锁(Meta Data Lock,MDL)3.3 意向锁3.3.1 案例引入3.3.2 意向锁的分类 4. 行级…

【超详细】从 0 到 1 打包你的 uni-app 应用:安卓篇打包指南

一. 介绍 在当前移动应用开发的大环境下,uni-app 作为一种使用 Vue.js 开发多平台应用的框架,为开发者提供了快速构建跨平台应用的能力。本文将为你介绍如何将 uni-app 项目打包成安卓应用,让你的应用在安卓设备上运行并上架应用市场。 二.…

学习之MySQL函数(字符串,数值,日期,流程)

字符串函数 函数是指一段可以直接被另一段程序或代码 案例: – 1、由于业务需求变更,企业员工的工号,统一为5位数,目前不足5位数的全部在前面补0、比如:1号员工的工号应该为00001. update emp set worknolpad(workno, 5, 0) 运…

2024大模型学习:机器学习在安全领域的应用|从大数据中识别潜在安全威胁

机器学习在安全领域的应用:从大数据中识别潜在安全威胁 🧑 作者简介:现任阿里巴巴嵌入式技术专家,15年工作经验,深耕嵌入式人工智能领域,精通嵌入式领域开发、技术管理、简历招聘面试。CSDN优质创作者&…

【王树森】RNN模型与NLP应用(8/9):Attention(个人向笔记)

前言 基于RNN的Seq2Seq模型无法记住长序列Attentnion机制可以大幅度提升Seq2Seq模型 Seq2Seq Model with Attention Attention可以让句子在逐步变长的时候不忘记前面的输入信息Attention还可以告诉Decoder应该关注哪一个状态优点:Attention可以大幅度提高准确率缺…

中小企业数字化营销突围秘籍,快来解锁!

​嘿,各位中小企业主们!在如今这个数字化时代,市场竞争那叫一个激烈。传统营销方式渐渐力不从心,而数字化营销则成为咱们中小企业突出重围的关键路径。 现状不容乐观 目前呢,有一部分中小企业已经迈出了数字化营销的步…

【hot100篇-python刷题记录】【最小覆盖子串】

R7-子串篇 class Solution:def minWindow(self, s: str, t: str) -> str:ret_left,ret_right-1,len(s)left0#s子串字母出现的次数cnt_sCounter()#t中字母出现的次数cnt_tCounter(t)for right,c in enumerate(s):cnt_s[c]1while cnt_s>cnt_t:#找到更短的子串if right-left…

破解“目录名称无效”难题:数据恢复实战指南

在数字化生活日益普及的今天,数据存储与管理成为了我们日常不可或缺的一部分。然而,当您尝试访问某个文件夹时,却遇到了“目录名称无效”的错误提示,这无疑会让人感到焦虑和困惑。本文将深入探讨“目录名称无效”这一问题的根源&a…

Unet改进11:在不同位置添加MLCA||轻量级的混合本地信道注意机制

本文内容:在不同位置添加MLCA注意力机制 目录 论文简介 1.步骤一 2.步骤二 3.步骤三 4.步骤四 论文简介 注意机制是计算机视觉中应用最广泛的组成部分之一,它可以帮助神经网络突出重要元素,抑制无关元素。然而,绝大多数通道注意机制只包含通道特征信息,忽略了空间特征…

android gradle阿里云镜像地址,下载速度快,而且几乎是最新的所有版本

阿里云Gradle的镜像地址: macports-distfiles-gradle安装包下载_开源镜像站-阿里云 还是比较全的,最主要是下载速度比较快。 这样可以节省很多时间。 我们可以利用离线的方式来使用这些Gradle就可以了。 android 离线的方式使用下载到本地的gradle-CS…

鸿蒙开发—黑马云音乐之music页面播放音乐(下)

目录 1.暂停播放和恢复播放 2.上一首、下一首功能 1.暂停播放和恢复播放 src/main/ets/services/AvPlayerManager.ets: export interface songItemType {img: stringname: stringauthor: stringurl: stringid: string }//作用:负责管理播放对象的各种…

Windows环境CP Editor安装使用方法

step0:下载软件包,附件有已经下载的安装包 Download CP Editor | CP Editor step1:下载后双击安装即可(记住安装路径) step2:找到安装目录下的cpeditor\mingw64\bin配置环境变量 step3:双击打开即可使用

pikachu 靶场环境搭建 完整版(手把手保姆级教学)

文章目录 一、pikachu靶场简介二、靶场环境准备三、pikachu 靶场搭建过程1、phpstudy 配置2、MySQL环境变量配置(非必要)3、pikachu 靶场配置4、靶场连接测试 四、pikachu靶场搭建时数据库连接问题等其它问题(Warning: mysqli_connect(): (HY000/1049): …

全球城市多边形和点数据集 (GUPPD)

全球城市多边形和点数据集 (GUPPD) 第 1 版是一套包含 123,034 个城市定居点的全球数据集,包含 1975-2030 年期间的地名和人口,每五年更新一次。该数据集建立在欧盟委员会联合研究中心 (JRC) 2015 年全球人类定居点 (GHS) 城市中心数据库 (UCDB) 的基础上…

【手撕数据结构】二叉树oj题

目录 单值二叉树题目描述题目思路及代码 相同的树题目描述题目思路及代码 对称二叉树题目描述题目思路及代码 另一棵树的子树题目描述题目思路及代码 二叉树的前序遍历题目描述题目思路及代码 二叉树的构建与遍历题目描述题目思路及代码 单值二叉树 题目描述 题目思路及代码 …

模型 情境领导力

系列文章 分享 模型,了解更多👉 模型_思维模型目录。灵活变通,因势利导的领导艺术。 1 情境领导力的应用 1.1 软件项目的成功转型 在一家知名的软件开发公司中,有一个由资深工程师李伟领导的团队,负责开发一款新的客…

Mac下的压缩包和Win看到的不一样怎么办 Mac压缩后Win电脑看文件名会乱码

在当今多平台的数字工作环境中,Mac和Windows用户常常需要交换文件,但有时候会遇到一些兼容性问题。特别是在处理压缩文件时,Mac用户创建的压缩包在Windows系统中打开时,常常会遇到文件名乱码的问题。本文将详细讨论“Mac下的压缩包…

基于AI大模型开发上层应用常见的技术栈

基于AI大模型的上层应用开发,技术栈要求通常包括以下几个方面: 编程语言:Python是AI领域的主要编程语言,具有大量的库和框架支持,是大模型开发的首选语言 。TypeScript也是不错的选择,很多模型对外提供类似…

postman学习笔记:从入门到精通

postman入门到精通 一、postman下载安装与更换主题1、下载与安装2、更换主题(Themes) 二、页面详解1、顶部工具栏2、左侧栏3、中部栏3.1 请求部分页签介绍3.2 响应部分页签介绍 三、管理用例四、设置环境变量和全局变量1、添加环境变量2、添加全局变量 五…