Siempre me ha molestado que la única forma de copiar un archivo en Java sea abrir secuencias, declarar un búfer, leer un archivo, recorrerlo y escribirlo en el otro vapor. La web está llena de implementaciones similares, aunque todavía ligeramente diferentes, de este tipo de solución.
¿Existe una mejor manera de mantenerse dentro de los límites del lenguaje Java (el significado no implica ejecutar comandos específicos del sistema operativo)? ¿Quizás en algún paquete de utilidad de código abierto confiable, eso al menos oscurecería esta implementación subyacente y proporcionaría una solución de una línea?
Respuestas:
Como el kit de herramientas menciona anteriormente, Apache Commons IO es el camino a seguir, específicamente FileUtils . copyFile () ; maneja todo el trabajo pesado por ti.
Y como posdata, tenga en cuenta que las versiones recientes de FileUtils (como la versión 2.0.1) han agregado el uso de NIO para copiar archivos; NIO puede aumentar significativamente el rendimiento de copia de archivos , en gran parte porque las rutinas de NIO difieren la copia directamente en el sistema operativo / sistema de archivos en lugar de manejarlo leyendo y escribiendo bytes a través de la capa de Java. Entonces, si está buscando rendimiento, puede valer la pena verificar que está utilizando una versión reciente de FileUtils.
fuente
Evitaría el uso de una mega api como apache commons. Esta es una operación simplista y está integrada en el JDK en el nuevo paquete NIO. Ya estaba vinculado en una respuesta anterior, pero el método clave en la API de NIO son las nuevas funciones "transferTo" y "transferFrom".
http://java.sun.com/javase/6/docs/api/java/nio/channels/FileChannel.html#transferTo(long,%20long,%20java.nio.channels.WritableByteChannel)
Uno de los artículos vinculados muestra una excelente manera de cómo integrar esta función en su código, utilizando transferFrom:
Aprender NIO puede ser un poco complicado, por lo que es posible que desee confiar en esta mecánica antes de comenzar y tratar de aprender NIO de la noche a la mañana. Por experiencia personal puede ser muy difícil de aprender si no tienes la experiencia y te presentaron a IO a través de las transmisiones de java.io.
fuente
Ahora con Java 7, puede usar la siguiente sintaxis de prueba con recursos:
O, mejor aún, esto también se puede lograr utilizando la nueva clase de archivos introducida en Java 7:
Bastante elegante, ¿eh?
fuente
La clase de utilidad
Copiar un directorio o archivo
Mover un directorio o archivo
Copiar un directorio o archivo de forma recursiva
fuente
En Java 7 es fácil ...
fuente
Para copiar un archivo y guardarlo en su ruta de destino, puede usar el siguiente método.
fuente
Tenga en cuenta que todos estos mecanismos solo copian el contenido del archivo, no los metadatos como los permisos. Entonces, si tuviera que copiar o mover un archivo .sh ejecutable en Linux, el nuevo archivo no sería ejecutable.
Para realmente copiar o mover un archivo, es decir, para obtener el mismo resultado que copiar desde una línea de comando, en realidad necesita usar una herramienta nativa. Ya sea un script de shell o JNI.
Aparentemente, esto podría solucionarse en Java 7: http://today.java.net/pub/a/today/2008/07/03/jsr-203-new-file-apis.html . ¡Dedos cruzados!
fuente
La biblioteca de guayaba de Google también tiene un método de copia :
Advertencia: si
to
representa un archivo existente, ese archivo se sobrescribirá con el contenido defrom
. Sito
y hacefrom
referencia al mismo archivo, se eliminará el contenido de ese archivo.Parámetros:
from
- el archivo de origento
- el archivo de destinoEmite:
IOException
- si se produce un error de E / SIllegalArgumentException
- sifrom.equals(to)
fuente
Disponible como estándar en Java 7, path.copyTo: http://openjdk.java.net/projects/nio/javadoc/java/nio/file/Path.html http://java.sun.com/docs/books/ tutorial / essential / io / copy.html
No puedo creer que les haya tomado tanto tiempo estandarizar algo tan común y simple como la copia de archivos :(
fuente
Tres posibles problemas con el código anterior:
Por eso
org.apache.tools.ant.util.ResourceUtils.copyResource
es tan complicado. También tenga en cuenta que si bien transferFrom está bien, transferTo se rompe en JDK 1.4 en Linux (vea el ID de error: 5056395 ) - Jesse Glick Janfuente
Si está en una aplicación web que ya usa Spring y no desea incluir Apache Commons IO para la copia simple de archivos, puede usar FileCopyUtils del marco Spring.
fuente
¡Aquí hay tres formas en que puede copiar fácilmente archivos con una sola línea de código!
Java7 :
java.nio.file.Files # copy
Appache Commons IO :
FileUtils # copyFile
guayaba :
Archivos # copia
fuente
Files.copy
usando sólo 2 parámetros es paraPath
aStream
. Sólo tiene que añadir el parámetroStandardCopyOption.COPY_ATTRIBUTES
oStandardCopyOption.REPLACE_EXISTING
paraPath
aPath
fuente
La copia NIO con un buffer es la más rápida según mi prueba. Vea el código de trabajo a continuación de un proyecto de prueba mío en https://github.com/mhisoft/fastcopy
}
fuente
Rápido y funciona con todas las versiones de Java también Android:
fuente
Un poco tarde para la fiesta, pero aquí hay una comparación del tiempo necesario para copiar un archivo utilizando varios métodos de copia de archivos. Entré en los métodos 10 veces y tomé un promedio. La transferencia de archivos usando flujos IO parece ser el peor candidato:
Aquí están los métodos:
El único inconveniente que puedo ver al usar la clase de canal NIO es que todavía parece que no puedo encontrar una manera de mostrar el progreso intermedio de la copia de archivos.
fuente