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 系列的,也有封装好的如 ...
随机推荐
- freemark 判断是否为空 是否存在
<!--1\---><!--判断aaa是否不为空,eclipse插件老报错.---><#if aaa??> ${aaa}</#if><!--2\ ...
- 通常Struts框架会自动地从action mapping中创建action对象
开发者不必在Spring中去注册action,尽管可以这么去做,通常Struts框架会自动地从action mapping中创建action对象 struts2-spring-plugin-x-x-x ...
- Make Rules
target: components ls TAB rule main:main.o mytool1.o mytool2.o gcc -o main main.o mytool1.o mytool2. ...
- 移动端<head>头部 常用<meta>标签
<!DOCTYPE html><html lang = ""><head> <title></title> <me ...
- 学习jsp(3)
HttpServletRequest和HttpServletResponse: response.setContentType("text/html;charset=UTF-8") ...
- vs2013 visual studio 插件安装
svn插件: AnkhSVN是一款在VS中管理Subversion的插件,您可以在VS中轻松的提交.更新.添加文件,而不用在命令行或资源管理器中提交.而且该插件属于开源项目· 官网:htt ...
- iOS 延迟执行
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(<#delayInSeconds#> * NSEC_PER_SEC)), ...
- ADO.net 扩展属性
扩展属性 处理:有外键关系时将代号化信息处理成原始文字,让用户可看懂的(粗略解释) 利用扩展属性 如:users表中的民族列显示的是民族代号处理成Nation表中的民族名称 需要在users类里面扩展 ...
- 转:windows 7系统安装与配置Tomcat服务器环境
工具/原料 jdk-7u45-windows-x64(我的系统是64位系统,32位的请选x86下载) apache-tomcat-8.0.0-RC5-windows-x64 方法/步骤 下载说明, ...
- cordova3.X 运用grunt生成plugin自定义插件骨架
Cordova提供了一组设备相关的API,通过这组API,移动应用能够以JavaScript访问原生的设备功能,如摄像头.麦克风等.Cordova还提供了一组统一的JavaScript类库,以及为这些 ...