Copier un répertoire en Java

1. Introduction

Dans ce court tutoriel, nous verrons comment copier un répertoire en Java, y compris tous ses fichiers et sous-répertoires. Cela peut être réalisé en utilisant les fonctionnalités Java de base ou des bibliothèques tierces.

2. Utilisation de l' API java.nio

Java NIO est disponible depuis Java 1.4. Java 7 a introduit NIO 2 qui apportait de nombreuses fonctionnalités utiles comme une meilleure prise en charge de la gestion des liens symboliques, l'accès aux attributs de fichiers. Il nous a également fourni des classes telles que Path , Paths et Files qui ont rendu la manipulation du système de fichiers beaucoup plus facile.

Démontrons cette approche:

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(); } }); }

Dans cet exemple, nous avons parcouru l'arborescence de fichiers enracinée dans le répertoire source donné en utilisant Files.walk () et avons appelé Files.copy () pour chaque fichier ou répertoire que nous avons trouvé dans le répertoire source.

3. Utilisation de l' API java.io

Java 7 a été un tournant du point de vue de la gestion du système de fichiers car il a introduit de nombreuses nouvelles fonctionnalités pratiques.

Toutefois, si nous voulons rester compatible avec les versions Java anciennes, nous pouvons copier un répertoire en utilisant récursion et java.io.File caractéristiques :

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)); } }

Dans ce cas, nous allons créer un répertoire dans le répertoire de destination pour chaque répertoire de l'arborescence des répertoires source . Ensuite, nous invoquerons la méthode copyDirectoryCompatibityMode () :

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

Voyons également comment copier un fichier à l'aide de FileInputStream et 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. Utilisation d'Apache Commons IO

Apache Commons IO possède de nombreuses fonctionnalités utiles telles que des classes d'utilitaires, des filtres de fichiers et des comparateurs de fichiers . Ici, nous utiliserons FileUtils qui fournissent des méthodes pour une manipulation facile des fichiers et des répertoires, c'est-à-dire lire, déplacer, copier.

Ajoutons commons-io à notre fichier pom.xml :

 commons-io commons-io 2.7 

Enfin, copions un répertoire en utilisant cette approche:

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

Comme le montre l'exemple précédent, Apache Commons IO rend les choses beaucoup plus faciles, car il suffit d'appeler la méthode FileUtils.copyDirectory () .

5. Conclusion

Cet article a illustré comment copier un répertoire en Java. Des exemples de code complets sont disponibles sur GitHub.