用Java复制文件的最快方法

时间:2010-10-23 15:43:04

标签: java file-io

用Java复制大量文件的最快方法是什么。到目前为止,我已经使用了文件流和nio。整体流似乎比nio快。到目前为止你有什么经历?

6 个答案:

答案 0 :(得分:20)

http://www.baptiste-wicht.com/2010/08/file-copy-in-java-benchmark/可能会得到你的答案。

  

对于基准测试,我使用不同的文件进行了测试。

     
      
  1. 小文件(5 KB)
  2.   
  3. 中等文件(50 KB)
  4.   
  5. 大文件(5 MB)
  6.   
  7. 胖文件(50 MB)
  8.   
  9. 一个巨大的文件(1.3 GB)只有二进制文件
  10.         

    我首先使用文本文件然后使用二进制文件进行测试。我用三种模式进行测试:

         
        
    1. 在同一个硬盘上。这是一个250 GB的IDE硬盘,带有8 MB的缓存。它的格式为Ext4。
    2.   
    3. 两个磁盘之间。我使用了第一个磁盘和另一个250 GB的SATA硬盘和16 MB的缓存。它的格式为Ext4。
    4.   
    5. 两个磁盘之间。我使用了第一个磁盘和另一个1 TB的SATA硬盘和32 MB的缓存。它使用NTFS格式化。
    6.         

      我使用基准框架described here来测试所有方法。测试是在我的个人计算机上进行的(Ubuntu 10.04 64位,Intel Core 2 Duo 3.16 GHz,6 Go DDR2,SATA硬盘)。使用的Java版本是Java 7 64位虚拟机...

答案 1 :(得分:9)

我会用:

import java.io.*;
import java.nio.channels.*;

public class FileUtils{
    public static void copyFile(File in, File out) 
        throws IOException 
    {
        FileChannel inChannel = new
            FileInputStream(in).getChannel();
        FileChannel outChannel = new
            FileOutputStream(out).getChannel();
        try {
            inChannel.transferTo(0, inChannel.size(),
                    outChannel);
        } 
        catch (IOException e) {
            throw e;
        }
        finally {
            if (inChannel != null) inChannel.close();
            if (outChannel != null) outChannel.close();
        }
    }

    public static void main(String args[]) throws IOException{
        FileUtils.copyFile(new File(args[0]),new File(args[1]));
  }
}

如果您的任何文件在Windows中大于64M,则可能需要查看以下内容: http://forums.sun.com/thread.jspa?threadID=439695&messageID=2917510

答案 2 :(得分:1)

让java fork一个复制文件的操作系统批处理脚本。您的代码可能必须编写批处理脚本。

答案 3 :(得分:1)

您可以使用apache commons-io库的FileUtils实现来复制文件

FileUtils.copyFile(new File(sourcePath), new File(destPath));

使用 FileChannel 进行IO操作。

或使用 java.nio.file.Files' copy()方法。

答案 4 :(得分:1)

它取决于文件(更大的文件),对我来说,这是具有缓冲流的最快方式

 public void copyFile(File inFileStr, File outFileStr) throws IOException {

    try (BufferedInputStream bis = new BufferedInputStream(new FileInputStream(inFileStr)); 
        BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(outFileStr))) {

        byte[] buffer = new byte[1024 * 1024];
        int read = 0;
        while ((read = bis.read(buffer)) != -1) {
            bos.write(buffer, 0, read);
        }

        bis.close();
        bos.close();
    } catch (IOException ex) {
        ex.printStackTrace();
    }

}

答案 5 :(得分:1)

使用流

int

使用频道

Bs...

使用Apache Commons IO

int

使用Java SE 7文件

private static void copyFileUsingStream(File source, File dest) throws IOException {
    InputStream is = null;
    OutputStream os = null;
    try {
        is = new FileInputStream(source);
        os = new FileOutputStream(dest);
        byte[] buffer = new byte[1024];
        int length;
        while ((length = is.read(buffer)) > 0) {
            os.write(buffer, 0, length);
        }
    } finally {
        is.close();
        os.close();
    }
}

性能测试

private static void copyFileUsingChannel(File source, File dest) throws IOException {
    FileChannel sourceChannel = null;
    FileChannel destChannel = null;
    try {
        sourceChannel = new FileInputStream(source).getChannel();
        destChannel = new FileOutputStream(dest).getChannel();
        destChannel.transferFrom(sourceChannel, 0, sourceChannel.size());
       }finally{
           sourceChannel.close();
           destChannel.close();
       }
}

结果

private static void copyFileUsingApacheCommonsIO(File source, File dest) throws IOException {
    FileUtils.copyFile(source, dest);
}