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
- 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();
}
}
- 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();
}
}
- 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);
}
- 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