Copiar Arquivo Java – 4 Maneiras de Copiar Arquivo em Java

Java copiar arquivo é uma operação muito comum. No entanto, a classe java.io.File não possui nenhum método abreviado para copiar um arquivo de origem para destino. Aqui vamos aprender sobre quatro maneiras diferentes de copiar arquivo em Java.

Java Copiar Arquivo

  1. Java Copiar Arquivo – Fluxo

Esta é a maneira convencional de copiar arquivos em Java. Aqui criamos dois arquivos – origem e destino. Em seguida, criamos InputStream da origem e escrevemos no arquivo de destino usando OutputStream para a operação de cópia de arquivo em Java. Aqui está o método que pode ser usado para copiar arquivo em Java usando fluxos.

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 Copiar Arquivo – java.nio.channels.FileChannel

As classes NIO do Java foram introduzidas no Java 1.4 e FileChannel pode ser usado para copiar arquivos em Java. De acordo com a documentação do método transferFrom(), esta maneira de copiar arquivo é supostamente mais rápida do que usar fluxos para copiar arquivos em Java. Aqui está o método que pode ser usado para copiar um arquivo usando 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 Copiar Arquivo – Apache Commons IO FileUtils

O FileUtils do Apache Commons IO .copyFile(File srcFile, File destFile) pode ser usado para copiar arquivos em Java. Se você já está usando o Apache Commons IO em seu projeto, faz sentido usar isso para simplificar o código. Internamente, ele usa o FileChannel do Java NIO, então você pode evitar este método de envoltório se não estiver usando-o para outras funções. Aqui está o método para usar o apache commons io para a operação de cópia de arquivo em java.

private static void copyFileUsingApacheCommonsIO(File source, File dest) throws IOException {
    FileUtils.copyFile(source, dest);
}
  1. Java Copiar Arquivo – Classe Files

Se você estiver trabalhando com o Java 7 ou superior, pode usar o método copy() da classe Files para copiar arquivos em java. Ele usa provedores de sistema de arquivos para copiar os arquivos.

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

Agora, para descobrir qual método é o mais rápido, escrevi uma classe de teste e executei os métodos acima um por um para copiar um arquivo de 1 GB. Em cada chamada, usei arquivos diferentes para evitar qualquer benefício para os métodos posteriores devido ao cache.

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");

        //copiar arquivo de maneira convencional usando Stream
        long start = System.nanoTime();
        copyFileUsingStream(source, dest);
        System.out.println("Time taken by Stream Copy = "+(System.nanoTime()-start));
        
        //copiar arquivos usando 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));
        
        //copiar arquivos usando 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));
        
        //usando a classe Files do 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));        
    }
}

Aqui está a saída do programa acima, observe que comentei o código acima para garantir que apenas um método seja usado a cada vez para a operação de cópia de arquivo em 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

Pela saída, fica claro que a cópia de fluxo é a melhor maneira de copiar arquivos em Java. Mas é um teste muito básico. Se você estiver trabalhando em um projeto intensivo em desempenho, então você deveria experimentar diferentes métodos para copiar arquivos em Java e anotar os tempos para descobrir a melhor abordagem para o seu projeto. Você também deveria brincar com diferentes maneiras de copiar arquivos em Java com base no tamanho médio do arquivo. Eu criei um vídeo no YouTube com 4 maneiras de copiar arquivos em Java, você pode assisti-lo para aprender mais. https://www.youtube.com/watch?v=op6tgG95zek

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