Copiar un directorio en Java

1. Introducción

En este breve tutorial, veremos cómo copiar un directorio en Java, incluidos todos sus archivos y subdirectorios. Esto se puede lograr mediante el uso de funciones básicas de Java o bibliotecas de terceros.

2. Usando la API java.nio

Java NIO ha estado disponible desde Java 1.4. Java 7 introdujo NIO 2 que trajo muchas características útiles como un mejor soporte para el manejo de enlaces simbólicos, acceso a atributos de archivos. También nos proporcionó clases como Path , Paths y Files que facilitaron mucho la manipulación del sistema de archivos.

Demostremos este enfoque:

public static void copyDirectory(String sourceDirectoryLocation, String destinationDirectoryLocation) throws IOException { Files.walk(Paths.get(sourceDirectoryLocation)) .forEach(source -> { Path destination = Paths.get(destinationDirectoryLocation, source.toString() .substring(sourceDirectoryLocation.length())); try { Files.copy(source, destination); } catch (IOException e) { e.printStackTrace(); } }); }

En este ejemplo, recorrimos el árbol de archivos enraizado en el directorio fuente dado usando Files.walk () e invocamos Files.copy () para cada archivo o directorio que encontramos en el directorio fuente.

3. Usando la API java.io

Java 7 fue un punto de inflexión desde la perspectiva de la gestión del sistema de archivos, ya que introdujo muchas funciones nuevas y útiles.

Sin embargo, si queremos seguir siendo compatibles con versiones anteriores de Java, podemos copiar un directorio usando la recursividad y las características de java.io.File :

private static void copyDirectory(File sourceDirectory, File destinationDirectory) throws IOException { if (!destinationDirectory.exists()) { destinationDirectory.mkdir(); } for (String f : sourceDirectory.list()) { copyDirectoryCompatibityMode(new File(sourceDirectory, f), new File(destinationDirectory, f)); } }

En este caso, crearemos un directorio en el directorio de destino para cada directorio en el árbol del directorio de origen . Luego invocaremos el método copyDirectoryCompatibityMode () :

public static void copyDirectoryCompatibityMode(File source, File destination) throws IOException { if (source.isDirectory()) { copyDirectory(source, destination); } else { copyFile(source, destination); } } 

Además, veamos cómo copiar un archivo usando FileInputStream y FileOutputStream :

private static void copyFile(File sourceFile, File destinationFile) throws IOException { try (InputStream in = new FileInputStream(sourceFile); OutputStream out = new FileOutputStream(destinationFile)) { byte[] buf = new byte[1024]; int length; while ((length = in.read(buf)) > 0) { out.write(buf, 0, length); } } } 

4. Uso de Apache Commons IO

Apache Commons IO tiene muchas características útiles como clases de utilidad, filtros de archivos y comparadores de archivos . Aquí usaremos FileUtils que proporcionan métodos para una fácil manipulación de archivos y directorios, es decir, leer, mover, copiar.

Agreguemos commons-io a nuestro archivo pom.xml :

 commons-io commons-io 2.7 

Finalmente, copiemos un directorio usando este enfoque:

public static void copyDirectory(String sourceDirectoryLocation, String destinationDirectoryLocation) throws IOException { File sourceDirectory = new File(sourceDirectoryLocation); File destinationDirectory = new File(destinationDirectoryLocation); FileUtils.copyDirectory(sourceDirectory, destinationDirectory); }

Como se muestra en el ejemplo anterior, Apache Commons IO lo hace todo mucho más fácil, ya que solo necesitamos llamar al método FileUtils.copyDirectory () .

5. Conclusión

Este artículo ilustró cómo copiar un directorio en Java. Las muestras de código completas están disponibles en GitHub.