Comment copier un fichier avec Java

1. Vue d'ensemble

Dans cet article, nous aborderons les méthodes courantes de copie de fichiers en Java.

Tout d'abord, nous utiliserons les API IO et NIO.2 standard , ainsi que deux bibliothèques externes: commons-io et guava.

2. API IO (avant JDK7)

Tout d'abord, pour copier un fichier avec l' API java.io , nous devons ouvrir un flux, parcourir le contenu en boucle et l'écrire dans un autre flux:

@Test public void givenIoAPI_whenCopied_thenCopyExistsWithSameContents() throws IOException { File copied = new File("src/test/resources/copiedWithIo.txt"); try ( InputStream in = new BufferedInputStream( new FileInputStream(original)); OutputStream out = new BufferedOutputStream( new FileOutputStream(copied))) { byte[] buffer = new byte[1024]; int lengthRead; while ((lengthRead = in.read(buffer)) > 0) { out.write(buffer, 0, lengthRead); out.flush(); } } assertThat(copied).exists(); assertThat(Files.readAllLines(original.toPath()) .equals(Files.readAllLines(copied.toPath()))); }

Beaucoup de travail pour implémenter ces fonctionnalités de base.

Heureusement pour nous, Java a amélioré ses API de base et nous avons un moyen plus simple de copier des fichiers à l'aide de l' API NIO.2 .

3. NIO.2 API (JDK7)

L'utilisation de NIO.2 peut considérablement augmenter les performances de copie de fichiers puisque NIO.2 utilise des points d'entrée système de niveau inférieur.

Examinons de plus près comment les fichiers. La méthode copy () fonctionne.

La méthode copy () nous donne la possibilité de spécifier un argument optionnel représentant une option de copie. Par défaut, la copie de fichiers et de répertoires n'écrasera pas les existants, ni ne copiera les attributs de fichier.

Ce comportement peut être modifié à l'aide des options de copie suivantes:

  • REPLACE_EXISTING - remplace un fichier s'il existe
  • COPY_ATTRIBUTES - copie les métadonnées dans le nouveau fichier
  • NOFOLLOW_LINKS - ne doit pas suivre les liens symboliques

La classe NIO.2 Files fournit un ensemble de méthodes surchargées de copy () pour copier des fichiers et des répertoires dans le système de fichiers.

Jetons un coup d'œil à un exemple utilisant copy () avec deux arguments Path :

@Test public void givenNIO2_whenCopied_thenCopyExistsWithSameContents() throws IOException { Path copied = Paths.get("src/test/resources/copiedWithNio.txt"); Path originalPath = original.toPath(); Files.copy(originalPath, copied, StandardCopyOption.REPLACE_EXISTING); assertThat(copied).exists(); assertThat(Files.readAllLines(originalPath) .equals(Files.readAllLines(copied))); }

Notez que les copies de répertoires sont superficielles , ce qui signifie que les fichiers et sous-répertoires du répertoire ne sont pas copiés.

4. Apache Commons IO

Une autre façon courante de copier un fichier avec Java consiste à utiliser la bibliothèque commons-io .

Tout d'abord, nous devons ajouter la dépendance:

 commons-io commons-io 2.6 

La dernière version peut être téléchargée depuis Maven Central.

Ensuite, pour copier un fichier, il suffit d'utiliser la méthode copyFile () définie dans la classe FileUtils . La méthode prend une source et un fichier cible.

Jetons un coup d'œil à un test JUnit en utilisant la méthode copyFile () :

@Test public void givenCommonsIoAPI_whenCopied_thenCopyExistsWithSameContents() throws IOException { File copied = new File( "src/test/resources/copiedWithApacheCommons.txt"); FileUtils.copyFile(original, copied); assertThat(copied).exists(); assertThat(Files.readAllLines(original.toPath()) .equals(Files.readAllLines(copied.toPath()))); }

5. Goyave

Enfin, nous allons jeter un œil à la bibliothèque Guava de Google.

Encore une fois, si nous voulons utiliser Guava , nous devons inclure la dépendance:

 com.google.guava guava 23.0 

La dernière version est disponible sur Maven Central.

Et voici la façon dont Guava copie un fichier:

@Test public void givenGuava_whenCopied_thenCopyExistsWithSameContents() throws IOException { File copied = new File("src/test/resources/copiedWithGuava.txt"); com.google.common.io.Files.copy(original, copied); assertThat(copied).exists(); assertThat(Files.readAllLines(original.toPath()) .equals(Files.readAllLines(copied.toPath()))); }

6. Conclusion

Dans cet article, nous avons exploré les moyens les plus courants de copier un fichier en Java.

La mise en œuvre complète de cet article est disponible à l'adresse over sur Github.