java 1G大文件复制
对比几种复制方法
复制的文件是980m的txt文件
1、 FileChannel 方法
代码:
public static void mappedBuffer() throws IOException{
long start=System.currentTimeMillis();
FileChannel read = new FileInputStream("n2.txt").getChannel();
FileChannel writer = new RandomAccessFile("n5.txt","rw").getChannel();
long i = 0;
long size = read.size()/30;
ByteBuffer bb,cc = null;
while(i<read.size()&&(read.size()-i)>size){
bb = read.map(FileChannel.MapMode.READ_ONLY, i, size);
cc = writer.map(FileChannel.MapMode.READ_WRITE, i, size);
cc.put(bb);
i+=size;
bb.clear();
cc.clear();
}
bb = read.map(FileChannel.MapMode.READ_ONLY, i, read.size()-i);
cc.put(bb);
bb.clear();
cc.clear();
read.close();
writer.close();
long end=System.currentTimeMillis();
System.out.println("用时:"+(end-start)+"毫秒");
}
耗时:807ms
使用NewIO技术复制大文件的速度最快,尤其是此方法中使用了内存映射技术,速度非常快。
2、 FileInputStream技术
public static void fileCopy(String srcFile,String tarFile)throws IOException{
long start=System.currentTimeMillis();
FileInputStream fis = null;
FileOutputStream fos = null;
File f =new File(srcFile);
fis = new FileInputStream(f);
fos = new FileOutputStream(tarFile);
int len=0;
byte[] b =new byte[t];
while((len=fis.read(b))!=-1){
fos.write(b);
fos.flush();
}
long end=System.currentTimeMillis();
System.out.println("用时:"+(end-start)+"毫秒"); if(fis!=null){
fis.close();
}
if(fos!=null){
fos.close();
}
}
耗时:
1072ms,速度也不慢,在处理文本文档的时候传统的io技术速度并不慢,但如果处理的是图像流文件,速度比NIO技术慢很多。
3、 BufferedOutputStream
比起FileInputStream多了一层包装
public static void fileCopy2(String srcFile,String tarFile)throws IOException{
long start=System.currentTimeMillis();
BufferedOutputStream fos = new BufferedOutputStream (new FileOutputStream(new File (tarFile)));
BufferedInputStream fis = new BufferedInputStream (new FileInputStream(new File (srcFile)));
int len=0;
byte[] b =new byte[t];
while((len=fis.read(b))!=-1){
fos.write(b);
fos.flush();
}
long end=System.currentTimeMillis();
System.out.println("用时:"+(end-start)+"毫秒"); if(fis!=null){
fis.close();
}
if(fos!=null){
fos.close();
}
}
耗时:
耗时问1175ms比FileInputStream慢了100ms(此处比较的前提是缓存数组大小一致 为100000)
4、 BufferedReader
public static void bufferedReader(String srcFile,String tarFile)throws IOException{
long start=System.currentTimeMillis();
BufferedReader br =new BufferedReader(new FileReader(new File(srcFile)));
BufferedWriter fr =new BufferedWriter(new FileWriter(new File(tarFile)));
int len = 0;
char[] ch =new char[t];
while((len=br.read(ch))!=-1){
fr.write(ch);
}
long end=System.currentTimeMillis();
System.out.println("用时:"+(end-start)+"毫秒");
br.close();
fr.close();
}
耗时足足达到50s,比起前几种方法简直天差地别,但此参数并非最优参数,如果改变数组大小,速度能明显提升
可比起前面的方法还是差了很远。
5、 FileReader
public static void bufferedReader2(String srcFile,String tarFile)throws IOException{
long start=System.currentTimeMillis();
FileReader br =new FileReader(new File(srcFile));
FileWriter fr =new FileWriter(new File(tarFile));
int len = 0;
char[] ch =new char[t];
while((len=br.read(ch))!=-1){
fr.write(ch);
}
long end=System.currentTimeMillis();
System.out.println("用时:"+(end-start)+"毫秒");
br.close();
fr.close();
}
此方法比起BufferedReader少了一层包装,速度也更快些
经过测试发现此方法的速度受数组大小的影响程度不大
此份文档中所有的方法的参数虽不是最优,但各种方法之间的速度有明显的差距,就不再累赘逐一寻找最优参数了
java 1G大文件复制的更多相关文章
- java操作大文件复制
https://www.cnblogs.com/coprince/p/6594348.html https://blog.csdn.net/w592376568/article/details/796 ...
- 【原创】用JAVA实现大文件上传及显示进度信息
用JAVA实现大文件上传及显示进度信息 ---解析HTTP MultiPart协议 (本文提供全部源码下载,请访问 https://github.com/grayprince/UploadBigFil ...
- java+web+大文件上传下载
文件上传是最古老的互联网操作之一,20多年来几乎没有怎么变化,还是操作麻烦.缺乏交互.用户体验差. 一.前端代码 英国程序员Remy Sharp总结了这些新的接口 ,本文在他的基础之上,讨论在前端采用 ...
- java filechannel大文件的读写
java读取大文件 超大文件的几种方法 转自:http://wgslucky.blog.163.com/blog/static/97562532201332324639689/ java 读取一个 ...
- java读大文件最快性能【转】
java读大文件最快性能 完全引用自: 几种读大文件方法的效率对比测试 据说1.88g只要5秒左右,未亲测. /** * 读大文件 * BufferedReader + char[] * @throw ...
- C# 跨服务大文件复制
跨服务的大文件复制,肯定要和本地大文件复制一样,分多次传递,要不然内存也承受不了,下面就说下如何实现大文件的跨服务复制······ 首先肯定要建立一个WCF的服务以及对应的客户端来测试服务,此方法请参 ...
- java读取 500M 以上文件,java读取大文件
java 读取txt,java读取大文件 设置缓存大小BUFFER_SIZE ,Config.tempdatafile是文件地址 来源博客http://yijianfengvip.blog.163.c ...
- java 读取txt,java读取大文件
java 读取txt,java读取大文件 package com.bbcmart.util; import java.io.File;import java.io.RandomAccessFile;i ...
- Java解决大文件读取的内存问题以及文件流的比较
Java解决大文件读取的内存问题以及文件流的比较 传统方式 读取文件的方式一般是是从内存中读取,官方提供了几种方式,如BufferedReader, 以及InputStream 系列的,也有封装好的如 ...
随机推荐
- 统计哪些程序占用了swap
命令如下 : for i in `cd /proc;ls |grep "^[0-9]"|awk ' $0 >100'` ;do awk '/Swap:/{a=a+$2}END ...
- Java 多线程 并发编程
一.多线程 1.操作系统有两个容易混淆的概念,进程和线程. 进程:一个计算机程序的运行实例,包含了需要执行的指令:有自己的独立地址空间,包含程序内容和数据:不同进程的地址空间是互相隔离的:进程拥有各种 ...
- ImportError: No module named setuptools
Python第三方模块中一般会自带setup.py文件,在Windows环境下,我们只需要使用命令 cd c:\Temp\foo python setup.py install 两个命令就可以完成第三 ...
- ${pageContext.request.contextPath} JSP取得绝对路径
一.问题 JSP中究竟采用绝对路径还是采用相对路径随着所采用技术的越来越复杂,这个问题也变得越来越难以解决. 1)采用相对路径遇到的问题 相对路径固然比较灵活,但如果想复制页面内的代 ...
- PostgreSQL Replication之第九章 与pgpool一起工作(7)
9.7 处理故障转移和高可用 可以使用pgpool来解决的一些明显的问题是高可用性和故障转移.一般来讲,有使用pgpool或者不使用pgpool可以用来处理这些问题的各种方法. 9.7.1 使用Pos ...
- 搭建企业cacti服务器
搭建企业cacti服务器 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 今天搭建了cacti,为了方便监控我的交换机~因为查了很多zabbix的资料关于监控交换机的教程~我都屡屡失 ...
- 字典:NSDictionary的应用举例
字典就是关键字及其定义(描述)的集合.Cocoa中的实现字典的集合NSDictionary在给定的关键字(通常是一个NSString)下存储一个数值(可以是任何类型的对象).然后你就可以用这个关键字来 ...
- [原创]Scala学习:for,function,lazy
1.for循环是一个循环控制结构,可以有效地编写需要执行的特定次数的循环.Scalar的循环说明如下的各种形式: 1)Scala中for循环最简单的语法是: for( var x <- Rang ...
- [转]Apache Maven 入门篇(下)
原文地址: Apache Maven 入门篇(下) 作者:George Ma 第一篇文章大概的介绍了一下Apache Maven以及它的下载和安装,并且运行了一个简单的示例.那么在对maven有了一点 ...
- SQL查询 练习题
设有一数据库,包括四个表:学生表(Student).课程表(Course).成绩表(Score)以及教师信息表(Teacher).四个表的结构分别如表1-1的表(一)~表(四)所示,数据如表1-2的表 ...