Pregunta

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

¿Fue útil?

Solución

Aquí se explica cómo hacer esto con las operaciones 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();
        }
    }
}

Otros consejos

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

Mientras tanto, hay algunas cosas a tener en cuenta.

File.renameTo generalmente funciona solo en el mismo volumen del sistema de archivos. Pienso en esto como el equivalente a un "mv" mando. Úselo si puede, pero para el soporte general de copia y movimiento, necesitará tener 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" mover ". Para hacer esto con la mayor eficiencia, use FileChannel.transferTo o FileChannel.transferFrom métodos. La implementación es específica de la plataforma, pero en general, al copiar de un archivo a otro, las implementaciones evitan transportar datos de un lado a otro entre el núcleo y el espacio del usuario, lo que genera un gran impulso en la eficiencia.

Echa un vistazo: 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í ...

Las respuestas anteriores parecen estar desactualizadas.

Java's 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 (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);

Intente utilizar org.apache.commons.io.FileUtils (Utilidades generales de manipulación de archivos). Las instalaciones se proporcionan con 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 destino   directorio.

Es simple, fácil y rápido.

Observación interesante: Intenté copiar el mismo archivo a través de varias clases de Java y tiempo impreso en nano segundos.

Duración usando la secuencia de bytes FileOutputStream: 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 (secuencia de texto de caracteres en búfer: 1 998 005

Duración usando (Copia de archivos NIO): 18 351 115

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top