Mover / Copiar Operaciones de Archivos en Java


¿Existe una biblioteca Java estándar que maneje operaciones de archivos comunes, como mover/copiar archivos/carpetas?

Author: Jonik, 2008-11-19

7 answers

Aquí está cómo hacer esto con java.nio operaciones:

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();
        }
    }
}
 71
Author: Rigo Vides,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-04-30 16:35:13

Todavía no, pero el Nuevo NIO (JSR 203) tendrá soporte para estas operaciones comunes.

Mientras tanto, hay algunas cosas a tener en cuenta.

Archivo.renameTo generalmente solo funciona en el mismo volumen del sistema de archivos. Pienso en esto como el equivalente a un comando "mv". Úselo si puede, pero para el soporte general de copia y movimiento, necesitará tener un respaldo.

Cuando un cambio de nombre no funciona, tendrá que copiar el archivo (eliminar el original con el archivo .eliminar si se trata de una operación "mover"). Para hacer esto con la mayor eficiencia, utilice el FileChannel.Transferencia o FileChannel.Métodos 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 núcleo y el espacio de usuario, lo que produce un gran aumento en la eficiencia.

 40
Author: erickson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-11-18 23:43:13

Echa un vistazo: http://commons.apache.org/io /

Tiene copia, y como se indica el JDK ya tiene movimiento.

No implemente su propio método de copia. Hay tantos flotando por ahí...

 17
Author: Pyrolistical,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-11-18 23:59:35

Las respuestas anteriores parecen estar desactualizadas.

El archivo de Java.renameTo () es probablemente la solución más fácil para API 7, y parece funcionar bien. Tenga cuidado NO ARROJA EXCEPCIONES, pero devuelve verdadero/falso!!!

Tenga en cuenta que parece haber problemas con él en versiones anteriores (igual que NIO).

Si necesita usar una versión anterior, marque aquí.

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);
 10
Author: ntg,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:16:57
 8
Author: Andrew McKinlay,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-07-05 16:14:13

Intente usar 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) = > Moves a directorio.

(2) FileUtils.moveDirectoryToDirectory (Archivo src, Archivo destDir, booleano createDestDir) => Mueve un directorio a otro directorio.

(3) FileUtils.MoveFile (Archivo srcFile, Archivo destFile) = > Mueve un archivo.

(4) FileUtils.moveFileToDirectory (Archivo srcFile, Archivo destDir, booleano createDestDir) => Mueve un archivo a un directorio.

(5) FileUtils.moveToDirectory (Archivo src, Archivo destDir, booleano createDestDir) => Mueve un archivo o directorio al destino directorio.

Es simple, fácil y rápido.

 7
Author: Dellanio,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-10-21 20:24:51

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 usando FileOutputStream byte stream: 4 965 078

Duración usando BufferedOutputStream: 1 237 206

Duración usando (lector de texto de caracteres: 2 858 875

Duración usando BufferedReader (flujo de texto de caracteres en búfer: 1 998 005

Duración de uso (Archivos NIO copy): 18 351 115

Al usar la opción de copia de archivos Nio, tomó casi 18 veces más!!! Nio es la opción más lenta para copiar archivos y BufferedOutputStream parece la más rápida. Usé el mismo archivo de texto simple para cada clase.

 0
Author: Elena,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-01-09 09:43:44