java中文件复制得速度测试

来源:互联网 发布:极客营it培训 编辑:程序博客网 时间:2024/05/22 10:53
说明:此文档仅供参考,欢迎各位测试和讨论结果

最近,对JAVA中文件复制得方式进行速度测试,得出如下结论,测试方案为:

1.传统IO包得复制方法:
  void fileByteCopy(String inFile,String outFile) throw* **ception
    {
        long t1=System.currentTimeMillis();
        FileInputStream  in =new FileInputStream(new File(inFile));
        FileOutputStream out=new FileOutputStream(new File(outFile),true);
        
        byte[] bytes=new byte[1024];
        int i;
        
        while((i=in.read(bytes))!=-1)
        {
            out.write(bytes,0,i);
        }
        
        //out.close();
        in.close();
        out.close();
        
        System.out.println("花费时间"+(System.currentTimeMillis()-t1)+"豪秒");
    }

2.新IO包中基于channel和direct buffer得测试:
  void fileBufferCopy(String inFile,String outFile) throw* **ception
    {
        long t1=System.currentTimeMillis();
        //FileInputStream  in =new FileInputStream(new File(inFile));
        //FileOutputStream out=new FileOutputStream(new File(outFile));
        
        FileChannel inChannel=new FileInputStream(new File(inFile)).getChannel();
        FileChannel ouChannel=new FileOutputStream(new File(outFile)).getChannel();
        
        ByteBuffer buffer=ByteBuffer.allocateDirect(1024);
        //while((int i=inChannel.read()))
        int i=0;
        
        while(true)
        {
            buffer.clear();
            if((i=inChannel.read(buffer))==-1)
            break;
            buffer.flip();
            ouChannel.write(buffer);
            
        }
        
        //out.close();
        inChannel.close();
        ouChannel.close();
        
        System.out.println("花费时间"+(System.currentTimeMillis()-t1)+"毫秒");
    }

3.直接影射,MappedByteBuffer
 void byteMapFileCopy(String inFile,String outFile) throw* **ception
  long t1=System.currentTimeMillis();
        File file=new File(inFile);
        FileChannel out=new FileOutputStream(new File(outFile)).getChannel();
        
        //FileInputStream input=new FileInputStream(file);
        
        MappedByteBuffer buffer=new FileInputStream(file).getChannel().map(FileChannel.MapMode.READ_ONLY,0,file.length());
                buffer.load();
        
        //Charset charset=Charset.defaultCharset();
        //Charset charset=Charset.forName("GBK");
        
        //CharBuffer charBuffer=charset.decode(buffer);
        
        //System.out.println(charBuffer);
        out.write(buffer);
        buffer=null;
        out.close();
        System.out.println("花费时间"+(System.currentTimeMillis()-t1)+"测试");

-------------------------------------------------------------------------------
测试文件大小为:200M,同一windows xp系统在只运行此应用程序(系统程序等必须除外,忙碌情况相同),得到如下近似结果:
一:传统IO复制大致消耗时间:9500-15000毫秒
二:direct buffer方式复制消耗时间:9000-15000毫秒
三:系统影射方式复制大致消耗时间:6000-10000毫秒

从以上可以看出,第三种方式稍好,不过从后两种方法得原理可以看出,他们比较依赖系统,因此在系统性能良好得情况下应该要优于传统得IO复制方式,如果复制得文件大小在20M-200M之间,我会优先选用第三种方案,不过它会直接把整个文件影射进内存,如果文件非常大得话,不知道此种方案能行通否? 
原创粉丝点击