Copiar un archivo 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 desde el origen al destino. Aquí aprenderemos sobre cuatro formas diferentes en las que podemos copiar un archivo en Java .
Copiar archivo Java
- Copiar archivo Java – Transmisión
Esta es la forma convencional de copiar archivos en Java. Aquí creamos dos archivos: origen y destino. Luego creamos InputStream desde el origen y lo escribimos en el archivo de destino usando OutputStream para la operación de copia de archivos en Java. Este es el método que se puede usar para copiar archivos en Java usando secuencias.
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(); }}
- Copiar archivo Java: java.nio.channels.FileChannel
Las clases NIO de Java se introdujeron en Java 1.4 y FileChannel se puede utilizar para copiar archivos en Java. Según el método transferFrom() de javadoc, se supone que esta forma de copiar archivos es más rápida que usar Streams para copiar archivos en Java. Este es el método que se puede utilizar para copiar un archivo 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(); }}
- Copiar archivo en Java: Apache Commons IO FileUtils
Apache Commons IO FileUtils . copyFile(File srcFile, File destFile) se puede utilizar para copiar archivos en Java. Si ya está utilizando Apache Commons IO en su proyecto, tiene sentido utilizar esto para simplificar el código. Internamente, utiliza Java NIO FileChannel, por lo que puede evitar este método contenedor si aún no lo está utilizando para otras funciones. Aquí se muestra el método para utilizar 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);}
- Copiar archivo en Java: clase Archivos
Si trabaja con Java 7 o una versión superior, puede utilizar el método copy() de la clase Files 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 que los métodos posteriores se beneficiaran 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"); //copy file conventional way using Stream long start = System.nanoTime(); copyFileUsingStream(source, dest); System.out.println("Time taken by Stream Copy = "+(System.nanoTime()-start)); //copy files using 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)); //copy files using 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)); //using Java 7 Files class 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á el resultado del programa anterior, tenga en cuenta que comenté el código anterior para asegurarme de que cada vez solo se use un método para la operación de copia de archivo Java.
Time taken by Stream Copy = 44582575000Time taken by Channel Copy = 104138195000Time taken by Apache Commons IO Copy = 108396714000Time taken by Java7 Files Copy = 89061578000
A partir del resultado, queda claro que Stream Copy es la mejor manera de copiar archivos en Java. Pero es una prueba muy básica. Si estás trabajando en un proyecto que requiere un alto rendimiento, entonces deberías probar diferentes métodos para copiar archivos en Java y anotar los tiempos para determinar el mejor enfoque para tu proyecto. También deberías probar diferentes formas de copiar archivos en Java en función del tamaño promedio de tus archivos. He creado un video de YouTube con 4 formas de copiar archivos en Java. Puedes mirarlo para obtener más información. https://www.youtube.com/watch?v=op6tgG95zek