对比几种复制方法

复制的文件是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大文件复制的更多相关文章

  1. java操作大文件复制

    https://www.cnblogs.com/coprince/p/6594348.html https://blog.csdn.net/w592376568/article/details/796 ...

  2. 【原创】用JAVA实现大文件上传及显示进度信息

    用JAVA实现大文件上传及显示进度信息 ---解析HTTP MultiPart协议 (本文提供全部源码下载,请访问 https://github.com/grayprince/UploadBigFil ...

  3. java+web+大文件上传下载

    文件上传是最古老的互联网操作之一,20多年来几乎没有怎么变化,还是操作麻烦.缺乏交互.用户体验差. 一.前端代码 英国程序员Remy Sharp总结了这些新的接口 ,本文在他的基础之上,讨论在前端采用 ...

  4. java filechannel大文件的读写

    java读取大文件 超大文件的几种方法 转自:http://wgslucky.blog.163.com/blog/static/97562532201332324639689/   java 读取一个 ...

  5. java读大文件最快性能【转】

    java读大文件最快性能 完全引用自: 几种读大文件方法的效率对比测试 据说1.88g只要5秒左右,未亲测. /** * 读大文件 * BufferedReader + char[] * @throw ...

  6. C# 跨服务大文件复制

    跨服务的大文件复制,肯定要和本地大文件复制一样,分多次传递,要不然内存也承受不了,下面就说下如何实现大文件的跨服务复制······ 首先肯定要建立一个WCF的服务以及对应的客户端来测试服务,此方法请参 ...

  7. java读取 500M 以上文件,java读取大文件

    java 读取txt,java读取大文件 设置缓存大小BUFFER_SIZE ,Config.tempdatafile是文件地址 来源博客http://yijianfengvip.blog.163.c ...

  8. java 读取txt,java读取大文件

    java 读取txt,java读取大文件 package com.bbcmart.util; import java.io.File;import java.io.RandomAccessFile;i ...

  9. Java解决大文件读取的内存问题以及文件流的比较

    Java解决大文件读取的内存问题以及文件流的比较 传统方式 读取文件的方式一般是是从内存中读取,官方提供了几种方式,如BufferedReader, 以及InputStream 系列的,也有封装好的如 ...

随机推荐

  1. Baseline模板管理

    SQL> alter session set NLS_DATE_FORMAT= 'yyyy-mm-dd hh24:mi:ss'; 创建单一基线模板: SQL> exec dbms_work ...

  2. Windows2000安装Winform Clickonce提示升级系统版本的解决方案

    Windows2000安装Winform Clickonce提示升级系统版本.只需要把所有应用的DLL的独立性设置为false就可以了.

  3. 怎么设置task的最大线程数

    //-------------------------------------------------------------------------- // // Copyright (c) Mic ...

  4. IntelliJ IDEA 显示行号方法

    设置方法如下:   File->Settings->Editor->General->Appearence->Show Line Number  

  5. devexpress13学习系列(三)PDFViewer(3)

    PdfDocumentProperties Class 该类,用来显示载入的pdf文件的属性,包括:   Name Description Application Indicates the appl ...

  6. FOJ 2013 11 月赛

    这套题目还是比较吊的,由于我的沙茶,还是很多没有做出来- -! C:逆序数 D:呵呵 A:妈蛋,自己精度没弄好,想到之前GCC的要加eps,就WA了几次后交Visual C++过了!C(n,m)p^m ...

  7. 接口是否可继承接口? 抽像类是否可实现(implements)接口? 抽像类是否可继承实体类(concrete class)?

    接口是否可继承接口? 抽像类是否可实现(implements)接口? 抽像类是否可继承实体类(concrete class)? 1. 接口可以继承接口. 2. 抽像类可以实现(implements)接 ...

  8. 查看Linux服务器各种信息方法

    有的时候需要搜集服务器的各种信息,比如cpu信息,内存信息,linux版本信息,安装的各种软件信息等等.下面总结几种主要指标的查看方法. 1. 查看Linux发行版信息 [root@pcmweb ~] ...

  9. zw版【转发·台湾nvp系列例程】HALCON ShapeTrans(Delphi)

    zw版[转发·台湾nvp系列例程]HALCON ShapeTrans(Delphi) procedure TForm1.Button1Click(Sender: TObject);var img: H ...

  10. 【fedora】强制解除yum锁定

    运行yum makecache时出现yum update时候出现Another app is currently holding the yum lock解决方法yum被锁定了. 可以通过执行 rm ...