Fastest way to copy files in Java

后端 未结 6 1027
萌比男神i
萌比男神i 2021-02-07 01:32

What ist the fastest way to copy a big number of files in Java. So far I have used file streams and nio. Overall streams seem to be faster than nio. What experiences did you mak

6条回答
  •  陌清茗
    陌清茗 (楼主)
    2021-02-07 01:54

    Using Stream

    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();
        }
    }
    

    Using Channel

    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();
           }
    }
    

    Using Apache Commons IO

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

    Using Java SE 7 Files

    private static void copyFileUsingJava7Files(File source, File dest) throws IOException {
        Files.copy(source.toPath(), dest.toPath());
    }
    

    Performance test

    File source = new File("/Users/tmp/source.avi");
    File dest = new File("/Users/tmp/dest.avi");
    
    //copy file conventional way using Stream
    long start = System.nanoTime();
    copyFileUsingStream(source, dest);
    System.out.println("Time taken by Stream Copy = "+(System.nanoTime()-start));
    
    //copy files using java.nio FileChannel
    source = new File("/Users/tmp/sourceChannel.avi");
    dest = new File("/Users/tmp/destChannel.avi");
    start = System.nanoTime();
    copyFileUsingChannel(source, dest);
    System.out.println("Time taken by Channel Copy = "+(System.nanoTime()-start));
    
    //copy files using apache commons io
    source = new File("/Users/tmp/sourceApache.avi");
    dest = new File("/Users/tmp/destApache.avi");
    start = System.nanoTime();
    copyFileUsingApacheCommonsIO(source, dest);
    System.out.println("Time taken by Apache Commons IO Copy = "+(System.nanoTime()-start));
    
    //using Java 7 Files class
    source = new File("/Users/tmp/sourceJava7.avi");
    dest = new File("/Users/tmp/destJava7.avi");
    start = System.nanoTime();
    copyFileUsingJava7Files(source, dest);
    System.out.println("Time taken by Java7 Files Copy = "+(System.nanoTime()-start));
    

    RESULTS

    Time taken by Stream Copy            =  44,582,575,000
    Time taken by Java7 Files Copy       =  89,061,578,000
    Time taken by Channel Copy           = 104,138,195,000
    Time taken by Apache Commons IO Copy = 108,396,714,000
    

提交回复
热议问题