java 读文件 优化_Java读取文件性能优化程序代码

读取文件就是对代码与算法上进行了一些细节上的修改了,下文我们来看一段java读取文件性能优化的例子。

在执行IO时,Java的InputStream被广泛使用,比如DataInputStream.readInt等等。事实上,这些高度封装的接口奇慢无比。我有一个项目启动时需要读取90MB左右的词典文件,用DataInputStream耗时3秒以上,换用java.nio包直接操作内存字节,可以加速到300ms左右,整整提速10倍!当然,前提是你熟悉位运算。

java.nio中提供了两类 FileChannel 和 ByteBuffer来将文件映射到内存,其中FileChannel表示文件通道,ByteBuffer是一个缓冲区。

具体步骤

①从FileInputStream、FileOutputStream以及RandomAccessFile对象获取文件通道

②将文件内存映射到ByteBuffer

③通过byteBuffer.array()接口得到一个byte数组

④直接操作字节

示例代码

 代码如下复制代码
 FileInputStream fis = new FileInputStream(path);

// 1.从FileInputStream对象获取文件通道FileChannel

FileChannel channel = fis.getChannel();

int fileSize = (int) channel.size();

// 2.从通道读取文件内容

ByteBuffer byteBuffer = ByteBuffer.allocate(fileSize);

// channel.read(ByteBuffer) 方法就类似于 inputstream.read(byte)

// 每次read都将读取 allocate 个字节到ByteBuffer

channel.read(byteBuffer);

// 注意先调用flip方法反转Buffer,再从Buffer读取数据

byteBuffer.flip();

// 可以将当前Buffer包含的字节数组全部读取出来

byte[] bytes = byteBuffer.array();

byteBuffer.clear();

// 关闭通道和文件流

channel.close();

fis.close();

int index = 0;

size = Utility.bytesHighFirstToInt(bytes, index);

index = 4;

其中,如果你当初使用了DataOutputStream.writeInt来保存文件的话,那么在读取的时候就要注意了。writeInt写入四个字节,其中高位在前,低位在后,所以将byte数组转为int的时候需要倒过来转换:

 代码如下复制代码

/**

* 字节数组和整型的转换,高位在前,适用于读取writeInt的数据

*

* @param bytes 字节数组

* @return 整型

*/

public static int bytesHighFirstToInt(byte[] bytes, int start)

{

int num = bytes[start 3] & 0xFF;

num |= ((bytes[start 2] << 8) & 0xFF00);

num |= ((bytes[start 1] << 16) & 0xFF0000);

num |= ((bytes[start] << 24) & 0xFF000000);

return num;

}

改变buffer的大小也可以起到使用

 代码如下复制代码
public static void copy1(File src, File dest) throws Exception {

FileInputStream fileInputStream = null;

FileOutputStream fileOutputStream = null;

try {

fileInputStream = new FileInputStream(src);

fileOutputStream = new FileOutputStream(dest);

byte[] buffer = new byte[8096];

int length = -1;

while((length = fileInputStream.read(buffer)) != -1) {

fileOutputStream.write(buffer, 0, length);//一次性将缓冲区的所有数据都写出去

fileOutputStream.flush();

}

} finally {

if(fileInputStream != null) {

fileInputStream.close();

}

if(fileOutputStream != null) {

fileOutputStream.close();

}

}

}

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

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

相关文章

全球企业KVM开源贡献榜发布,腾讯云、华为、阿里巴巴等入围

9月16日晚&#xff0c;在全球虚拟化顶级技术峰会 KVM Forum 上&#xff0c;2021年度全球企业 KVM 开源贡献榜正式发布&#xff0c;华为、腾讯云、阿里巴巴等中国公司纷纷入围。其中&#xff0c;腾讯云更是连续第五年入围&#xff0c;成为唯一取得这一成就的中国企业。 据了解&a…

使用MQTT与函数计算做热力图的实践

简介&#xff1a; 在各类场景中&#xff0c;关于上报数据的处理无处不在&#xff0c;而以上提到的场景都可以通过本方案的MQTTFCAPI Gateway的方式参考优化来实现。 前言 最近几年&#xff0c;我们在一些商场、图书馆、机场或港口环境里&#xff0c;经常可以看到一些机器人在转…

Google 宣布推出隐私计算核心服务;Amazon Managed Grafana正式可用……

NEWS本周新闻回顾Google 宣布推出隐私计算核心服务今年 5 月 Google I/O 开发者大会发布 Android 12 的同时&#xff0c;宣布了隐私计算核心&#xff08;Private Compute Core&#xff09;。这是一项开源计划&#xff0c;提供了一个沙盒式的安全环境&#xff0c;将智能回复、实…

java instance变量_java 类方法和实例方法 以及 类变量和实例变量

类体中的方法分为实例方法和类方法两种&#xff0c;用static修饰的是类方法类方法&#xff1a;对于类中的类方法&#xff0c;在该类被加载到内存时&#xff0c;就分配了相应的入口地址。从而类方法不仅可以被类创建的任何对象调用执行&#xff0c;也可以直接通过类名调用。类方…

谈身份管理之基础篇 - 保障云上安全,从[规范账号使用]开始

简介&#xff1a; 身份和密钥的管理&#xff0c;是企业上云的重中之重&#xff1b;每年国内外都有因为身份和密钥的管理不善&#xff0c;或泄露&#xff0c;或误操作导致严重的生产事故或者数据泄露。本期小编将重点聊聊云上身份的那些值得关注的事儿。 引言 2021年初&#xf…

开课啦 dubbo-go 微服务升级实战

简介&#xff1a; 杭州开课啦教育科技有限公司是一家致力于为中小学生提供学习辅导的在线教育公司&#xff0c;目前公司后端服务基础设施主要依托于阿里云原生&#xff0c;其中包含计算、网络、存储以及 Kubernetes 服务。 技术选型背景 2020 年是开课啦公司发展壮大的一年&am…

gui界面设计心得体会 python_Python笔记-GUI界面设计(tkinter)

文章目录前言相关介绍一、函数方法介绍二、导入tkinter库三、窗口[1]. 创建[2]. 设置标题[3]. 设置大小[4]. 设置背景色[5]. 删除窗口四、按钮[1]. 创建[2]. 放置按钮(绝对位置)[3]. 放置按钮(相对位置)[4]. 代码五、单行文本[1]. 创建[2]. 代码前言此篇文章介绍的是有关图形用…

阿里云科技驱动“数字化转型”,助力中小企业发展“突围”

2020年至2021年的新冠疫情&#xff0c; 让全世界进入了困难模式&#xff0c;国家的经济运行不得不放缓脚步。这不仅给每个人造成了很多不便&#xff0c;更是给人们所依赖的企业组织&#xff0c;造成了巨大的影响。每一个微观个体所感受的只是自己身边肉眼可见的影响&#xff0c…

这些中秋礼盒绝了,悄悄惊艳互联网人

整理 | 王晓曼出品 | 程序人生 &#xff08;ID&#xff1a;coder _life&#xff09;来了来了它们来了&#xff0c;2021年腾讯、阿里、百度、字节等诸多互联网大厂带着他们的中秋礼盒来了&#xff01;“八月十五月儿圆&#xff0c;中秋月饼香又甜”&#xff0c;没有月饼的中秋节…

想成为全栈工程师,要做到哪几点?

简介&#xff1a; 如何成为一名全栈工程师&#xff1f;需要具备哪些技术积累&#xff1f;成为全栈工程师有哪些好处&#xff1f;希望本文能为期望成为全栈工程师的同学提供一点帮助&#xff0c;和同学们一起分享交流。 作为开发者&#xff0c;我们不过度区分服务端 server 客户…

DDD as Code:如何用代码诠释领域驱动设计?

简介&#xff1a; 相较于常规的MVC架构&#xff0c;DDD更抽象、更难以理解&#xff0c;各个开发者对DDD的解释也不尽相同。那么哪种设计方式才更好&#xff1f;在学习时如何知道哪种DDD更正统&#xff0c;没有被别人带歪&#xff1f;本文尝试使用“DDD as Code”的概念&#xf…

谈身份管理之进阶篇 - 快速了解从管理到治理的最佳方案

简介&#xff1a; 云上身份安全是当今企业管理者和云上运维团队所面临的挑战之一&#xff0c;针对云上身份管理不全面所产生的风险究竟又哪些&#xff1f;又应当如何应对&#xff1f;本文将结合案例和最佳实践与您分享。 引言 云上身份安全是当今企业管理者和云上运维团队所面…

java替换花括号,用正则表达式替换Java中的大括号{}之间的所有文本

I have a long string with numerous occurences of text between { } that I would like to remove however when I do this:data data.replaceAll("{(.*?)}", "");i get an error, so what am I doing wrong / how should I go about doing this?解决…

报名倒计时 | TeaTalk 深圳站邀您共话安全云世界

对越发复杂的网络环境&#xff0c;保障网络安全势不可挡&#xff0c;为此国家也对应颁布了系列规章政策。除相关政策外&#xff0c;网络安全及云安全也同时被列入国家规划重点发展方向&#xff0c;随着“十三五”规划逐渐落实&#xff0c;“十四五”规划制定实施&#xff0c;推…

KubeNode:阿里巴巴云原生 容器基础设施运维实践

简介&#xff1a; 目前 KubeNode 已经覆盖了阿里巴巴集团的所有的 ASI 集群&#xff0c;接下来&#xff0c;将随着阿里巴巴集团“统一资源池”的项目&#xff0c;推进 KubeNode 覆盖更大的范围、更多的场景&#xff0c;让云原生的容器基础设施运维架构发挥更大的价值。 阿里巴巴…

lnmp yum安装mysql_centos5 yum安装lnmp

之所以转载这篇文章&#xff0c;是因为咱们如果一直使用军歌的编译安装包的话&#xff0c;那么时间上浪费不少(性能优秀的vps都至少需要17分钟安装lnmp.org的lnmp)&#xff0c;因此阿福极力推荐使用yum安装。YUM安装特点&#xff1a;比编译安装速度快安全&#xff0c;yum安装是…

扫盲贴|如何评价一款App的稳定性和质量?

简介&#xff1a; 我们不应该为了掩盖代码质量问题&#xff0c;通过手动try catch去规避某些问题&#xff0c;这样有可能会打断用户的正常使用&#xff0c;并造成感知性的阻断反馈&#xff0c;应该从用户使用APP时的真实感知出发&#xff0c;当出现问题时及时捕获和处理问题。 …

聊聊 5G 云专线

作者|小枣君来源|鲜枣课堂通过本文&#xff0c;和大家分享探讨一下 5G 云专线。我们从今天文章的标题开始说起吧。5G、云、专线&#xff0c;分开的3个词&#xff0c;作为通信人&#xff0c;大家应该都懂&#xff08;专线可能陌生一点&#xff09;。但是&#xff0c;合起来之后&…

谈AK管理之基础篇 - 如何进行访问密钥的全生命周期管理?

简介&#xff1a; 我们也常有听说例如AK被外部攻击者恶意获取&#xff0c;或者员工无心从github泄露的案例&#xff0c;最终导致安全事故或生产事故的发生。AK的应用场景极为广泛&#xff0c;因此做好AK的管理和治理就尤为重要了。本文将通过两种AK使用不安全的典型案例&#x…

2021信服云创新峰会:托管云成上云第三种选择

9月17日&#xff0c;以“万物皆可云”为主题的信服云创新峰会成功举办。中国工程院院士、中国科学院计算技术研究所研究员倪光南&#xff0c;IDC咨询&#xff08;北京&#xff09;有限公司副总裁/首席分析师武连峰&#xff0c;深信服科技股份有限公司创始人、CEO何朝曦&#xf…