La copia de archivos en Java es una operación muy común. Pero la clase java.io.File no tiene ningún método abreviado para copiar un archivo de origen a destino. Aquí aprenderemos sobre cuatro formas diferentes en las que podemos copiar archivos en Java.
Java Copiar Archivo
- Java Copiar Archivo – Stream
Esta es la forma convencional de copiar archivos en Java. Aquí creamos dos archivos, uno de origen y otro de destino. Luego creamos un InputStream a partir del archivo de origen y lo escribimos en el archivo de destino usando un OutputStream para la operación de copiar archivos en Java. Aquí está el método que se puede utilizar para copiar un archivo en Java utilizando 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 Copiar Archivo – java.nio.channels.FileChannel
Las clases Java NIO se introdujeron en Java 1.4 y FileChannel se puede utilizar para copiar archivos en Java. Según la documentación del método transferFrom(), esta forma de copiar archivos se supone que es más rápida que usar Streams para copiar archivos en Java. Aquí está el método que se puede utilizar para copiar un archivo utilizando 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 Archivo – Apache Commons IO FileUtils
Apache Commons IO FileUtils.copyFile(File srcFile, File destFile) se puede utilizar para copiar archivos en Java. Si ya estás utilizando Apache Commons IO en tu proyecto, tiene sentido usar esto por su simplicidad de código. Internamente utiliza Java NIO FileChannel, por lo que puedes evitar este método de envoltura si no lo estás utilizando ya para otras funciones. Aquí está el método para usar Apache Commons IO para la operación de copia de archivos en Java.
private static void copyFileUsingApacheCommonsIO(File source, File dest) throws IOException {
FileUtils.copyFile(source, dest);
}
- Copia de Archivos en Java – Clase Files
Si estás trabajando en Java 7 o superior, puedes usar la clase Files y su método copy() para copiar archivos en Java. Utiliza proveedores del sistema de archivos para copiar los archivos.
private static void copyFileUsingJava7Files(File source, File dest) throws IOException {
Files.copy(source.toPath(), dest.toPath());
}
Ahora, para averiguar cuál es el método más rápido, escribí una clase de prueba y ejecuté los métodos anteriores uno por uno para copiar un archivo de 1 GB. En cada llamada, utilicé archivos diferentes para evitar cualquier beneficio para los métodos posteriores debido al almacenamiento en caché.
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 archivo de forma convencional usando Stream
long start = System.nanoTime();
copyFileUsingStream(source, dest);
System.out.println("Time taken by Stream Copy = "+(System.nanoTime()-start));
// copiar archivos 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 archivos 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 la clase Files de 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));
}
}
Aquí está la salida del programa anterior, ten en cuenta que comenté el código anterior para asegurarme de que cada vez se utilice solo un método para la operación de copia de archivos en 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
Por la salida, está claro que la Copia de Transmisión es la mejor manera de copiar un Archivo en Java. Pero es una prueba muy básica. Si estás trabajando en un proyecto intensivo en rendimiento, entonces deberías probar diferentes métodos para copiar archivos en Java y tomar nota de los tiempos para determinar el mejor enfoque para tu proyecto. También deberías probar diferentes formas de copiar archivos en Java según el tamaño promedio de los archivos. He creado un vídeo en YouTube con 4 formas de copiar archivos en Java, puedes verlo para aprender más. https://www.youtube.com/watch?v=op6tgG95zek
Source:
https://www.digitalocean.com/community/tutorials/java-copy-file