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
由此可见,将文件部分或者全部映射到内存后进行读写,速度将提高很多。
这是因为内存映射文件首先将外存上的文件映射到内存中的一块连续区域,被当成一个字节数组进行处理,读写操作直接对内存进行操作,而后再将内存区域重新映射到外存文件,这就节省了中间频繁的对外存进行读写的时间,大大降低了读写时间。
java 提交的内存_Java使用内存映射实现大文件的上传相关推荐
- java实现大文件分片上传
java实现大文件分片上传 在项目中用到了大文件上传功能,最初从网上参考了一些代码来实现,但是最终的上传效果不是很好,速度比较慢. 之前的上传思路是: 前端利用webUploader分片大文件 后端接 ...
- Java实现腾讯云COS高级(大文件)上传,不考虑分块
// 腾讯云COS高级(大文件)上传,不用考虑分块public static URL fileCOS(File file, String key) throws Exception {String S ...
- java http 上传大文件上传_java实现大文件的上传
最近项目经理逼着让偶做树的展开,表嵌套表,可惜偶刚参加工作,水平低,这不在查资料嘛,可是不多久就传来了经理的叫嚣声,这么简单的东西,都一天了,你还没做完..................,哎真是郁闷 ...
- java多线程上传文件_Java大文件分片上传/多线程上传
这里只写后端的代码,基本的思想就是,前端将文件分片,然后每次访问上传接口的时候,向后端传入参数:当前为第几块文件,和分片总数 下面直接贴代码吧,一些难懂的我大部分都加上注释了: 上传文件实体类: 看得 ...
- java 开源 断点续传,全平台大文件断点续传上传技术 ( 开源项目 Stream )
Stream 上传插件介绍 Stream 这个项目主要是为了解决大文件上传, 本程序只是它的一个 Perl 后端的实现. 项目网站是: http://www.twinkling.cn 原始地址是: h ...
- chrome java上传文件_springboot+webuploader 实现大文件切片上传,兼容IE8+,chrome等浏览器,可运行...
[实例简介] https://blog.csdn.net/weifangzjx/article/details/83898265 [实例截图] [核心代码] 上传例子 └── 上传例子 └── fil ...
- 在浏览器进行大文件分片上传(java服务端实现)
微信搜索:"二十同学" 公众号,欢迎关注一条不一样的成长之路 最近在做web网盘的系统,网盘最基本的功能便是文件上传,但是文件上传当遇到大文件的时候,在web端按传统方式上传简直是 ...
- java 写tb级文件_三管齐下!TB 级文件的上传性能瞬间被优化 100 倍!
作者 | 中华石杉 责编 | 伍杏玲 本文经授权转载石杉的架构笔记(ID:shishan100) 这篇文章我们来看看,世界上最优秀的分布式文件系统HDFS,是如何对超大文件的上传做性能优化的? 首先, ...
- java图片上传下载_java实现文件的上传和下载
1. servlet 如何实现文件的上传和下载? 1.1上传文件 参考自:http://blog.csdn.net/hzc543806053/article/details/7524491 通过前台选 ...
最新文章
- rails 添加外键_如何在Rails后端中添加功能强大的搜索引擎
- html保存blob,HTML文本图像并保存为Blob到数据库
- python对电脑最低要求-用Python编写的代码瑕疵程度最低
- php执行删除语句代码,ThinkPHP之数据删除和执行原生SQL语句
- js实现Form表单submit提交截获数据(各浏览器通用)
- [Android] Android颜色对应的xml配置值
- 深拷贝的缺点_JavaScript 深拷贝
- Android使用token维持登陆状态的方法
- dellt服务器r修复,RE: 求助 Dell T 310服务器蓝屏
- LeetCode 1403. 非递增顺序的最小子序列(排序)
- JAVA 使用类的继承和接口实现多态
- 【报告分享】转变与机遇:从京东大数据看2020消费市场与品牌成长.pdf(附下载链接)...
- python前端开发招聘_[昆明] EMQX 招聘 Python ,前端开发工程师
- rand()与srand()的简单应用(随机数)
- 异常:由于代码已经过优化或者本机框架位于调用堆栈之上,无法计算表达式的值。...
- 如何使用键盘操控苹果Mac?
- JDK自带的int值的sun.text.IntHashtable
- python创建一个字典、其中值为1_从2个列表创建一个字典,其中一个作为键,另一个作为python中的值...
- python将网页转换为图片保存
- 我的世界修改服务器头像,我的世界头像
热门文章
- 使用Spring RestTemplate和Super类型令牌消费Spring-hateoas Rest服务
- Spring Data REST的实际应用
- LazyInitializationException的四种解决方案–第2部分
- Linux 环境变量启动过程/配置文件的读取过程
- Linux 命令之 timedatectl -- 查看系统当前时区设置
- 混合模式商城的可经销商品池
- android+阴影+xml,Android 阴影视图 ShadowViewHelper
- php 打包下载网络图片,PHP实现图片批量打包下载功能
- css 深度选择器 ,CSS的coped私有作用域和深度选择器
- dedian系统云服务器,云服务器选择Ubuntu还是Debian镜像系统?根据熟悉度选择