Рубрики
Без рубрики

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

Файл Копии Java. Копия файла Java. Скопируйте файл на Java с помощью потока ввода-вывода Java, файлового канала Java NIO, файлов ввода-вывода Apache Commons.CopyFile, Files.copy(), видеопотоков

Автор оригинала: Pankaj Kumar.

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

Файл копии Java

  1. Поток файлов копирования Java

Это обычный способ копирования файлов на java. Здесь мы создаем два файла – исходный и конечный. Затем мы создаем входной поток из исходного кода и записываем его в файл назначения, используя выходной поток для операции копирования файла 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.каналы.Файловый канал

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

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

Вот метод использования apache commons io для работы с файлами копирования java.

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

Если вы работаете на Java 7 или выше, вы можете использовать Файлы класс копировать() метод для копирования файла на 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

Из выходных данных ясно, что потоковое копирование-лучший способ копирования файла на Java. Но это очень простой тест. Если вы работаете над проектом с высокой производительностью, вам следует опробовать различные методы копирования файлов java и записать время, чтобы определить наилучший подход для вашего проекта.

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

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