Copiar Arquivo Java – 4 Maneiras de Copiar Arquivo em Java

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

Java Copy File

  1. Java Copy File – Stream

Esta é a maneira convencional de copiar arquivos em Java. Aqui criamos dois arquivos – origem e destino. Em seguida, criamos um InputStream a partir 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 arquivos em Java usando streams.

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 Copy File – java.nio.channels.FileChannel

As classes Java NIO 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(), essa maneira de copiar arquivos é supostamente mais rápida do que usar Streams para a cópia de arquivos em Java. Aqui está o método que pode ser usado para copiar um arquivo usando o 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 Copy File – Apache Commons IO FileUtils

Apache Commons IO FileUtils.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 simplicidade no código. Internamente, ele utiliza o FileChannel do Java NIO, portanto, você pode evitar este método de invólucro 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. Copiar Arquivo em Java – Classe Files

Se você estiver trabalhando com Java 7 ou superior, pode usar a classe Files com o método copy() para copiar arquivos em Java. Ele utiliza 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 é o método mais rápido, eu escrevi uma classe de teste e executei os métodos acima um por um para copiar um arquivo de 1 GB. Em cada chamada, eu usei arquivos diferentes para evitar qualquer benefício para métodos posteriores devido a 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 da 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 o 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 eu comentei o código acima para garantir que a cada vez apenas um método seja usado 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

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

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