java 提交的内存_Java使用内存映射实现大文件的上传

在处理大文件时,如果利用普通的FileInputStream 或者FileOutputStream 抑或RandomAccessFile 来进行频繁的读写操作,都将导致进程因频繁读写外存而降低速度.如下为一个对比实验。

package test;

import java.io.BufferedInputStream;

import java.io.FileInputStream;

import java.io.FileNotFoundException;

import java.io.IOException;

import java.io.RandomAccessFile;

import java.nio.MappedByteBuffer;

import java.nio.channels.FileChannel;

public class Test {

public static void main(String[] args) {

try {

FileInputStream fis=new FileInputStream("/home/tobacco/test/res.txt");

int sum=0;

int n;

long t1=System.currentTimeMillis();

try {

while((n=fis.read())>=0){

sum+=n;

}

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

long t=System.currentTimeMillis()-t1;

System.out.println("sum:"+sum+" time:"+t);

} catch (FileNotFoundException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

try {

FileInputStream fis=new FileInputStream("/home/tobacco/test/res.txt");

BufferedInputStream bis=new BufferedInputStream(fis);

int sum=0;

int n;

long t1=System.currentTimeMillis();

try {

while((n=bis.read())>=0){

sum+=n;

}

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

long t=System.currentTimeMillis()-t1;

System.out.println("sum:"+sum+" time:"+t);

} catch (FileNotFoundException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

MappedByteBuffer buffer=null;

try {

buffer=new RandomAccessFile("/home/tobacco/test/res.txt","rw").getChannel().map(FileChannel.MapMode.READ_WRITE, 0, 1253244);

int sum=0;

int n;

long t1=System.currentTimeMillis();

for(int i=0;i<1253244;i++){

n=0x000000ff&buffer.get(i);

sum+=n;

}

long t=System.currentTimeMillis()-t1;

System.out.println("sum:"+sum+" time:"+t);

} catch (FileNotFoundException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

}

测试文件为一个大小为1253244字节的文件。测试结果:

sum:220152087 time:1464

sum:220152087 time:72

sum:220152087 time:25

说明读数据无误。删去其中的数据处理部分。

package test;

import java.io.BufferedInputStream;

import java.io.FileInputStream;

import java.io.FileNotFoundException;

import java.io.IOException;

import java.io.RandomAccessFile;

import java.nio.MappedByteBuffer;

import java.nio.channels.FileChannel;

public class Test {

public static void main(String[] args) {

try {

FileInputStream fis=new FileInputStream("/home/tobacco/test/res.txt");

int sum=0;

int n;

long t1=System.currentTimeMillis();

try {

while((n=fis.read())>=0){

//sum+=n;

}

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

long t=System.currentTimeMillis()-t1;

System.out.println("sum:"+sum+" time:"+t);

} catch (FileNotFoundException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

try {

FileInputStream fis=new FileInputStream("/home/tobacco/test/res.txt");

BufferedInputStream bis=new BufferedInputStream(fis);

int sum=0;

int n;

long t1=System.currentTimeMillis();

try {

while((n=bis.read())>=0){

//sum+=n;

}

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

long t=System.currentTimeMillis()-t1;

System.out.println("sum:"+sum+" time:"+t);

} catch (FileNotFoundException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

MappedByteBuffer buffer=null;

try {

buffer=new RandomAccessFile("/home/tobacco/test/res.txt","rw").getChannel().map(FileChannel.MapMode.READ_WRITE, 0, 1253244);

int sum=0;

int n;

long t1=System.currentTimeMillis();

for(int i=0;i<1253244;i++){

//n=0x000000ff&buffer.get(i);

//sum+=n;

}

long t=System.currentTimeMillis()-t1;

System.out.println("sum:"+sum+" time:"+t);

} catch (FileNotFoundException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

}

测试结果:

sum:0 time:1458

sum:0 time:67

sum:0 time:8

由此可见,将文件部分或者全部映射到内存后进行读写,速度将提高很多。

这是因为内存映射文件首先将外存上的文件映射到内存中的一块连续区域,被当成一个字节数组进行处理,读写操作直接对内存进行操作,而后再将内存区域重新映射到外存文件,这就节省了中间频繁的对外存进行读写的时间,大大降低了读写时间。

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

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

相关文章

【渝粤题库】陕西师范大学210006幼儿园课程作业(高起专)

《幼儿园课程》&#xff08;专科&#xff09;作业 一、单选题 1、活动课程是以&#xff08; &#xff09;为中心来组织学习内容的。 A 学科 B 问题 C 概念 D 儿童 2、&#xff08; &#xff09;指的是幼儿园教师根据实际情况灵活的将课程方案转化为生动的课程实践&#xff08;现…

创建一个安全的Spring REST API

“我喜欢编写身份验证和授权代码。” 〜从来没有Java开发人员。 厌倦了一次又一次地建立相同的登录屏幕&#xff1f; 尝试使用Okta API进行托管身份验证&#xff0c;授权和多因素身份验证。 “如果有用&#xff0c;它将被修改。” 这些智慧之言来自我的QA老师&#xff0c;他们…

【渝粤题库】陕西师范大学292071社会统计学作业(高起专)

《社会统计学》作业 一、单项选择题 1、从历史上看&#xff0c;在社会经济统计学的形成过程中&#xff0c;首先使用“统计学”这一术语的是&#xff08; &#xff09;。 A. 政治算术学派 B. 国势学派 C. 数理统计学派 D. 社会经济统计学派 2、社会统计的研究对象是&#xff08;…

java并发编程十 原子累加器和Unsafe

文章目录 原子累加器cas 锁原理之伪共享 UnsafeUnsafe CAS 操作 原子累加器 累加器性能比较 private static <T> void demo(Supplier<T> adderSupplier, Consumer<T> action) {T adder adderSupplier.get();long start System.nanoTime();List<Thread…

mysql select 返回列_SQL / mysql – selectdistinct / UNIQUE,但返回所有列?

你正在寻找一个组&#xff1a;select * from table group by field1偶尔可以写一个独特的声明&#xff1a;select distinct on field1 * from table然而&#xff0c;在大多数平台上&#xff0c;上述两者都不会起作用&#xff0c;因为其他列上的行为是未指定的。 (MySQL中的第一…

【渝粤题库】陕西师范大学300018 世界史(下)

《世界史&#xff08;下&#xff09;》作业 一、名词解释 1、三权分立 2、考迪罗 3、斯大林格勒会战 4、马歇尔计划 5、匈牙利事件 6、美第奇家族 7、明治维新 8、人文主义 9、古巴导弹危机 10、奴隶贸易 11、七年战争 12、大西洋宪章 13、重商主义 14、文官制度 15、《解放宣言…

【渝粤题库】陕西师范大学600002 物理化学(下) 作业(专升本)

《物理化学&#xff08;下&#xff09;》作业 一.选择题 1.已知298 K时&#xff0c;(NH4)2SO4.NaOH.Na2SO4的 分别为3.064 10-2. 2.451 10-2.2.598 10-2 Sm2 mol-1&#xff0c;则NH4OH的为 ( ) A. 1.474 10-2 B. 2.684 10-2 C. 2.949 10-2 D. 5.428 10-2 2.质量摩尔浓度…

java中的规范是什么意思_Java中的异常规范有什么好处?

我从C来到Java.在Java和C中,我们都可以指定异常.看起来像这样&#xff1a;void function_name() throw(Exception){...if (error){throw Exception("Error");}...}据我所知,在C中编写异常规范被认为是一种不好的做法.与C不同,在Java中,我们必须这样做.所以,我的问题是…

jpa中::::_项目学生:JPA标准查询

jpa中::::这是Project Student的一部分。 其他职位包括带有Jersey的Webservice Client&#xff0c;带有Jersey的 Webservice Server &#xff0c; 业务层 &#xff0c; 具有Spring Data的持久性 &#xff0c;分片集成测试数据和Webservice Integration 。 我们已经介绍了CRUD的…

【渝粤题库】陕西师范大学800011 专题地图制图

《专题地图制图》作业 一、名词解释 1、专题地图 2、范围法 3、绝对比率符号 4、电子地图 5、普通地图 6、质底法 7、分级统计图法 8、条件比率符号 9、视觉重力 10、定位图表法 11、连续比率符号 12、互补色 二、填空 1、专题地图按照内容的概括程度可以分为 、 、 。 2、专题…

国家开放大学2021春1098中学数学教学研究题目

教育 教育 试卷代号&#xff1a;1098 2021年春季学期期末统一考试 中学数学教学研究 试题 2021年7月 一、填空题&#xff08;本题共20分&#xff0c;每个空2分&#xff09; 1&#xff0e;布卢姆把认知领域的目标分为 、 、 、________4个等级目标。 2&#xff0e;中学数学教学…

java 注解scheduler_使用spring的@Scheduled注解执行定时任务,启动项目不输出警告

在applicationContext.xml中添加&#xff1a;xmlns:task"http://www.springframework.org/schema/task"xsi:schemaLocation"http://www.springframework.org/schema/taskhttp://www.springframework.org/schema/task/spring-task-4.0.xsd">java代码&…

具有ELK的APIGEE API网关日志管理(Elastic Search,Logstash和Kibana)

在本文中&#xff0c;我们将看到如何使用 Elastic Search &#xff0c; Logstash 和 Kibana 管理APIGEE API网关生成的日志 。 下图突出显示了日志数据如何流经ELK堆栈以进行数据可视化和监视。 作为API网关的一部分&#xff0c;我们将使用MessageLogging策略在代理流&#xf…

【渝粤题库】陕西师范大学209010 现代教育战略 作业 (专升本)

《现代教育战略》作业 一、辨析题 1.战术是战略的具体表现形式&#xff0c;二者是一般和特殊的关系。 2.政治品德素质是一个人对国家、民族的政治意识、立场&#xff0c;是一个人的道德好感&#xff0c;是不可教的。 3.创新的新就一般意义的新事物。 4.能力就是一个所拥有的知识…

【渝粤教育】电大中专混凝土结构题库作业 题库

1.题结构试验时&#xff0c;试件的就位型式最符合实际受力状态而应优先采用的是() A.反位试验 B.正位试验 C.卧位试验 D.异位试验 正确 正确答案&#xff1a;左边查询 学生答案&#xff1a;B 2.非破损检测技术可应用于混凝土、钢材和砖石砌体等各种材料组成的结构构件的结构试验…

java中PL层_安装pljava - RuralHunter的个人空间 - OSCHINA - 中文开源技术交流社区

pljava是pgsql跟java的桥接&#xff0c;安装以后就可以在pgsql里面调用java了。这里记录一下我在ubuntu server下安装的过程1. 下载源码编译很简单&#xff0c;下载&#xff0c;解压&#xff0c;设置一下JAVA_HOME(如果没设的话)&#xff0c;然后make2. 把生成的build目录里面的…

【渝粤题库】广东开放大学 民事诉讼法学 形成性考核

选择题 题目&#xff1a;在仲裁裁决具有可撤销的法定理由时&#xff0c;仲裁当事人可以向法院申请撤销该仲裁裁决&#xff0c;法院认为当事人的申请具有法定撤销理由的&#xff0c;可以&#xff08; &#xff09;仲裁裁决。 答案&#xff1a; A、调解 B、裁定撤销 C、判决撤销…

java依赖注入_Java依赖注入选项

java依赖注入我想花一些时间来总结一些流行的Java依赖注入&#xff08;DI&#xff09;框架。 这是可用功能的高级概述。 首先&#xff0c;什么是依赖注入&#xff1f; “依赖注入是一种软件设计模式&#xff0c;可以删除硬编码的依赖&#xff0c;并可以在运行时或编译时更改它…

【渝粤教育】电大中专跨境电子商务理论与实务 (19)作业 题库

1.亚马逊的运营模式是M2C模式:平台招商。该说法&#xff08; &#xff09; A.错误 B.正确 错误 正确答案&#xff1a;左边查询 学生答案&#xff1a;未作答 2.B2C跨境电商或平台的代表企业有敦煌网&#xff0e;阿里巴巴国际站。该说法&#xff08; &#xff09; A.错误 B.正确 …

Java连接微软ad_Java:连接到Active Directory(AD)?

我正在尝试与AD联系。我试图用这个代码来连接&#xff0c;但它似乎并没有连接。我很抱歉不能比这更具体&#xff0c;但这只是我所知道的。什么都没发生。我已经删除了我认为是这个类的非必要部分&#xff0c;在那里处理结果&#xff0c;因为在这一点上根本没有任何结果需要处理…