Java拷贝文件性能的测试

http://www.javabloger.com/article/java-copy-file-performance.html上看到Java拷贝文件的性能中介绍,使用NIO性能会很高,于是用NIO和org.apache.io.FileUtils的copyFile方法做了一下测试对比:

 

package com.demo.test.file;

import java.io.File;
import java.io.IOException;

import org.apache.commons.io.FileUtils;

/**
 * @author user
 * Description: 操作文件
 * 2012-5-5
 */
public class HandleFile {
	
	/**
	 * Description: 采用java nio里面的FileChannel,非堵塞I/O的文件管道模式,是java 对稍大文件copy 运行效率最高的方式.
	 * @deprecated 如果只是Copy一个小文件或者运行的频率比较低,非NIO方式和NIO方式差不了多少。
	 * @param fileFromPath
	 * @param fileToPath
	 */
	public static void copyFile(String fileFromPath, String fileToPath)  {
        try {
            // 读取文件创建一个管道
            java.nio.channels.FileChannel srcChannel = new java.io.FileInputStream(fileFromPath).getChannel();
            
            // 在管道上创建一个输出的目标地址
            java.nio.channels.FileChannel dstChannel = new java.io.FileOutputStream(fileToPath).getChannel();
            
            // 进行文件复制
            dstChannel.transferFrom(srcChannel, 0, srcChannel.size());
            
            // 运行复制结束,并且关闭 输入/输出管道流
            srcChannel.close();
            dstChannel.close();
        } 
        catch (IOException e) {
            e.printStackTrace();
        }
    }
	
	public static void copyFile2(String srcPath, String destPath){
		try {
			FileUtils.copyFile(new File(srcPath), new File(destPath));
			
		} catch (IOException e) {
			e.printStackTrace();
		}

	}
	
	public static void main(String[] args) {
		long initMils = System.currentTimeMillis();
		copyFile("D:\\亚健康学基础(scrom).zip", "D:\\tmp\\scorm.zip");
		long endMils = System.currentTimeMillis();
		System.out.println("NIO copyFile use time is:" + (endMils - initMils) + "MilliSeconds");
		
		long initMils2 = System.currentTimeMillis();
		copyFile("D:\\亚健康学基础(scrom).zip", "D:\\temp\\scorm.zip");
		long endMils2 = System.currentTimeMillis();
		System.out.println("org.apache.io.FileUtils copyFile use time is:" + (endMils2 - initMils2) + "MilliSeconds");
		
	}

}
 

运行结果如下:

 

NIO copyFile use time is:1282MilliSeconds
org.apache.io.FileUtils copyFile use time is:656MilliSeconds

 

 FileUtils的copyFile比使用NIO快差不多1倍,FileUtils的copyFile源码:

 

FileInputStream  input = new FileInputStream(srcFile);
FileOutputStream output = new FileOutputStream(destFile);

byte buffer[] = new byte[4096];
        long count = 0L;
        for(int n = 0; -1 != (n = input.read(buffer));)
        {
            output.write(buffer, 0, n);
            count += n;
        }

 可看出copyFile中的buffer数组的容量为4096,所以在操作大文件上更胜一筹。

 

 

 

你可能感兴趣的:(java)