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少了一层包装,速度也更快些

经过测试发现此方法的速度受数组大小的影响程度不大

此份文档中所有的方法的参数虽不是最优,但各种方法之间的速度有明显的差距,就不再累赘逐一寻找最优参数了

时间: 2024-11-03 21:45:03

java 1G大文件复制的相关文章

java操作大文件复制

1.大文件的复制可以用Java nio中的channel-to-channel传输,Channel-to-channel传输是可以极其快速的,特别是在底层操作系统提供本地支持的时候.某些操作系统可以不必通过用户空间传递数据而进行直接的数据传输.对于大量的数据传输,这会是一个巨大的帮助. 2.代码 package com.dingwang.File; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; i

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

用JAVA实现大文件上传及显示进度信息 ---解析HTTP MultiPart协议 一. 大文件上传基础描述: 各种WEB框架中,对于浏览器上传文件的请求,都有自己的处理对象负责对Http MultiPart协议内容进行解析,并供开发人员调用请求的表单内容. 比如: Spring 框架中使用类似CommonsMultipartFile对象处理表二进制文件信息. 而.NET 中使用HtmlInputFile/ HttpPostedFile对象处理二进制文件信息. 优点:使用框架内置对象可以很方便的

java+web+大文件上传下载

文件上传是最古老的互联网操作之一,20多年来几乎没有怎么变化,还是操作麻烦.缺乏交互.用户体验差. 一.前端代码 英国程序员Remy Sharp总结了这些新的接口 ,本文在他的基础之上,讨论在前端采用HTML5的API,对文件上传进行渐进式增强:     * iframe上传  * ajax上传  * 进度条  * 文件预览  * 拖放上传 1.1 传统形式 文件上传的传统形式,是使用表单元素file,参考 http://www.ruanyifeng.com/blog/2012/08/file_

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

java 读取txt,java读取大文件 设置缓存大小BUFFER_SIZE ,Config.tempdatafile是文件地址 来源博客http://yijianfengvip.blog.163.com/blog/static/175273432201191354043148/ package com.yjf.util;import java.io.File;import java.io.RandomAccessFile;import java.nio.MappedByteBuffer;imp

大文件复制时进行实时保存

1 int main(int argc, const char * argv[]) { 2 @autoreleasepool { 3 4 5 //复制文件 6 7 8 //找到原来的文件路径 9 NSString *soureFilePath = @"/Users/scjy/Downloads/51CTO下载-10大iOS开发者最喜爱的类库.doc"; 10 11 //指定新的文件路径(文件不存在) 12 NSString *objectFilePath = @"/Users

java filechannel大文件的读写

java读取大文件 超大文件的几种方法 转自:http://wgslucky.blog.163.com/blog/static/97562532201332324639689/ java 读取一个巨大的文本文件既能保证内存不溢出又能保证性能 2010-09-25 11:18:50|  分类: 默认分类 |字号 订阅 import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import java.

解决java读取大文件内存溢出问题、如何在不重复读取与不耗尽内存的情况下处理大文件

1.传统的在内存中读取 读取文件行的标准方式是在内存中读取,Guava 和Apache Commons IO都提供了如下所示快速读取文件行的方法: 1 2 3 Files.readLines(new File(path), Charsets.UTF_8); FileUtils.readLines(new File(path)); 这种方法带来的问题是文件的所有行都被存放在内存中,当文件足够大时很快就会导致程序抛出OutOfMemoryError 异常. 例如:读取一个大约1G的文件: 1 2 3

Java读取大文件的高效率实现

1.概述 本教程将演示如何用Java高效地读取大文件.这篇文章是Baeldung (http://www.baeldung.com/) 上“Java——回归基础”系列教程的一部分. 2.在内存中读取 读取文件行的标准方式是在内存中读取,Guava 和Apache Commons IO都提供了如下所示快速读取文件行的方法: Files.readLines(new File(path), Charsets.UTF_8); FileUtils.readLines(new File(path)); 这种

java读取大文件 超大文件的几种方法

计算机技术学习用书: 编程技术资料:http://myitbook.taobao.com/  电脑技术群:291644908    用技术改变人生,欢迎您的加入 java 读取一个巨大的文本文件既能保证内存不溢出又能保证性能 2010-09-25 11:18:50|  分类: 默认分类 |字号 订阅 import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import java.io.Rando