Копирование файла на Java – 4 способа копирования файла на Java

Копирование файла в Java – очень распространенная операция. Но класс java.io.File не имеет никакого удобного метода для копирования файла из источника в пункт назначения. Здесь мы узнаем о четырех разных способах копирования файла в Java.

Копирование файла в Java

  1. Копирование файла в Java – потоки

Это традиционный способ копирования файла в Java. Здесь мы создаем два файла – исходный и пункт назначения. Затем мы создаем InputStream из исходного файла и записываем его в пункт назначения, используя OutputStream для операции копирования файла в Java. Вот метод, который можно использовать для копирования файла в Java с использованием потоков.

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();
    }
}
  1. Копирование файла в Java – java.nio.channels.FileChannel

Классы Java NIO были введены в Java 1.4, и класс FileChannel может использоваться для копирования файла в Java. Согласно документации по методу transferFrom(), этот способ копирования файла должен быть быстрее, чем использование потоков для копирования файлов в Java. Вот метод, который можно использовать для копирования файла с использованием FileChannel.

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();
   }
}
  1. Копирование файла в Java – Apache Commons IO FileUtils

Apache Commons IO FileUtils.copyFile(File srcFile, File destFile) можно использовать для копирования файла в Java. Если вы уже используете Apache Commons IO в своем проекте, имеет смысл использовать его для упрощения кода. Внутренне он использует Java NIO FileChannel, поэтому вы можете избежать этот метод-оболочку, если уже не используете его для других функций. Вот метод для использования Apache Commons IO для операции копирования файла в Java.

private static void copyFileUsingApacheCommonsIO(File source, File dest) throws IOException {
    FileUtils.copyFile(source, dest);
}
  1. Копирование файла Java – класс Files

Если вы работаете в Java 7 или выше, вы можете использовать метод Files класса copy() для копирования файла в Java. Он использует провайдеры файловой системы для копирования файлов.

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

Теперь, чтобы выяснить, какой метод является самым быстрым, я написал тестовый класс и последовательно выполнил вышеуказанные методы для копирования файла размером 1 ГБ. При каждом вызове я использовал разные файлы, чтобы избежать каких-либо преимуществ для последующих методов из-за кэширования.

package com.journaldev.files;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.nio.channels.FileChannel;
import java.nio.file.Files;

import org.apache.commons.io.FileUtils;

public class JavaCopyFile {

    public static void main(String[] args) throws InterruptedException, IOException {
        File source = new File("/Users/pankaj/tmp/source.avi");
        File dest = new File("/Users/pankaj/tmp/dest.avi");

        //копирование файла обычным способом с использованием Stream
        long start = System.nanoTime();
        copyFileUsingStream(source, dest);
        System.out.println("Time taken by Stream Copy = "+(System.nanoTime()-start));
        
        //копирование файлов с использованием java.nio FileChannel
        source = new File("/Users/pankaj/tmp/sourceChannel.avi");
        dest = new File("/Users/pankaj/tmp/destChannel.avi");
        start = System.nanoTime();
        copyFileUsingChannel(source, dest);
        System.out.println("Time taken by Channel Copy = "+(System.nanoTime()-start));
        
        //копирование файлов с использованием apache commons io
        source = new File("/Users/pankaj/tmp/sourceApache.avi");
        dest = new File("/Users/pankaj/tmp/destApache.avi");
        start = System.nanoTime();
        copyFileUsingApacheCommonsIO(source, dest);
        System.out.println("Time taken by Apache Commons IO Copy = "+(System.nanoTime()-start));
        
        //использование класса Files в Java 7
        source = new File("/Users/pankaj/tmp/sourceJava7.avi");
        dest = new File("/Users/pankaj/tmp/destJava7.avi");
        start = System.nanoTime();
        copyFileUsingJava7Files(source, dest);
        System.out.println("Time taken by Java7 Files Copy = "+(System.nanoTime()-start));        
    }
}

Вот вывод вышеуказанной программы, обратите внимание, что я закомментировал вышеуказанный код, чтобы убедиться, что каждый раз используется только один метод для операции копирования файлов в Java.

Time taken by Stream Copy = 44582575000
Time taken by Channel Copy = 104138195000
Time taken by Apache Commons IO Copy = 108396714000
Time taken by Java7 Files Copy = 89061578000

Из вывода ясно, что Stream Copy – лучший способ копирования файлов в Java. Но это очень базовый тест. Если вы работаете над проектом с высокой производительностью, то вам следует попробовать различные методы копирования файлов в Java и записать время, чтобы определить лучший подход для вашего проекта. Вы также можете поиграть с различными способами копирования файлов в Java в зависимости от среднего размера файла. Я создал видеоролик на YouTube о 4 способах копирования файла в Java, вы можете посмотреть его, чтобы узнать больше. https://www.youtube.com/watch?v=op6tgG95zek

Source:
https://www.digitalocean.com/community/tutorials/java-copy-file