files - Mover/copiar operaciones de archivos en Java
move all files in java (7)
Consulte: http://commons.apache.org/io/
Tiene copia, y como se dijo, el JDK ya tiene movimiento.
No implemente su propio método de copia. Hay tantos flotando por ahí ...
¿Hay una biblioteca estándar de Java que maneje operaciones comunes de archivos como mover / copiar archivos / carpetas?
Intente utilizar org.apache.commons.io.FileUtils (utilidades generales de manipulación de archivos). Las instalaciones se proporcionan en los siguientes métodos:
(1) FileUtils.moveDirectory (File srcDir, File destDir) => Mueve un directorio.
(2) FileUtils.moveDirectoryToDirectory (File src, File destDir, boolean createDestDir) => Mueve un directorio a otro directorio.
(3) FileUtils.moveFile (File srcFile, File destFile) => Mueve un archivo.
(4) FileUtils.moveFileToDirectory (File srcFile, File destDir, boolean createDestDir) => Mueve un archivo a un directorio.
(5) FileUtils.moveToDirectory (File src, File destDir, boolean createDestDir) => Mueve un archivo o directorio al directorio de destino.
Es simple, fácil y rápido.
La biblioteca de guayaba de Google también tiene estos:
http://guava-libraries.googlecode.com/svn/trunk/javadoc/com/google/common/io/Files.html
Las respuestas anteriores parecen estar desactualizadas.
Java File.renameTo() es probablemente la solución más fácil para API 7, y parece funcionar bien. Tenga cuidado ¡NO LANZA EXCEPCIONES, pero devuelve verdadero / falso!
Tenga en cuenta que parece haber problemas con él en versiones anteriores (lo mismo que NIO ).
Si necesita usar una versión anterior, marque here .
Here''s an example for API7:
File f1= new File("C://Users//.....//foo");
File f2= new File("C://Users//......//foo.old");
System.err.println("Result of move:"+f1.renameTo(f2));
Alternativamente:
System.err.println("Move:" +f1.toURI() +"--->>>>"+f2.toURI());
Path b1=Files.move(f1.toPath(), f2.toPath(), StandardCopyOption.ATOMIC_MOVE ,StandardCopyOption.REPLACE_EXISTING ););
System.err.println("Move: RETURNS:"+b1);
Observación interesante: Intenté copiar el mismo archivo a través de varias clases de Java y el tiempo impreso en nano segundos.
Duración mediante el flujo de bytes FileOutputStream: 4 965 078
Duración usando BufferedOutputStream: 1 237 206
Duración usando (texto de caracteres Reader: 2 858 875
Duración utilizando BufferedReader (Flujo de texto de caracteres almacenados en buffer: 1 998 005
Duración usando (archivos de copia NIO): 18 351 115
cuando se usa la opción de copia de Files Nio, ¡tomó casi 18 veces más! Nio es la opción más lenta para copiar archivos y BufferedOutputStream parece ser el más rápido. Usé el mismo archivo de texto simple para cada clase.
Todavía no, pero el nuevo NIO (JSR 203) tendrá soporte para estas operaciones comunes.
Mientras tanto, hay algunas cosas que se deben tener en cuenta.
File.renameTo generalmente funciona solo en el mismo volumen del sistema de archivos. Pienso en esto como el equivalente a un comando "mv". Úselo si puede, pero para soporte general de copia y movimiento, necesitará un respaldo.
Cuando un cambio de nombre no funciona, deberá copiar el archivo (eliminando el original con File.delete si se trata de una operación de "movimiento"). Para hacer esto con la mayor eficiencia, use los métodos FileChannel.transferTo o FileChannel.transferFrom . La implementación es específica de la plataforma, pero en general, al copiar de un archivo a otro, las implementaciones evitan el transporte de datos entre el kernel y el espacio del usuario, lo que genera un gran impulso en la eficiencia.
A continuación, se explica cómo hacerlo con java.nio
operaciones de java.nio
:
public static void copyFile(File sourceFile, File destFile) throws IOException {
if(!destFile.exists()) {
destFile.createNewFile();
}
FileChannel source = null;
FileChannel destination = null;
try {
source = new FileInputStream(sourceFile).getChannel();
destination = new FileOutputStream(destFile).getChannel();
// previous code: destination.transferFrom(source, 0, source.size());
// to avoid infinite loops, should be:
long count = 0;
long size = source.size();
while((count += destination.transferFrom(source, count, size-count))<size);
}
finally {
if(source != null) {
source.close();
}
if(destination != null) {
destination.close();
}
}
}