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