Поиск по сайту:

Java Copy File - 4 способа скопировать файл в Java


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

Копировать файл Java

  1. Файл копирования Java — поток

Это обычный способ копирования файлов в java. Здесь мы создаем два файла — исходный и целевой. Затем мы создаем 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();
    }
}

<старт=\2\>

  • Файл копирования Java — java.nio.channels.FileChannel
  • Классы Java NIO были представлены в Java 1.4, а FileChannel можно использовать для копирования файла в java. Согласно методу transferFrom() javadoc, этот способ копирования файла должен быть быстрее, чем использование Streams для файлов копирования 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();
       }
    }
    

    <старт=\3\>

  • Файл копирования 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);
    }
    

    <старт=\4\>

  • Java Copy File — класс 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");
    
            //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/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));
            
            //copy files using 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));
            
            //using Java 7 Files class
            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