Comment copier un fichier avec Java

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 standardIO etNIO.2, ainsi que deux bibliothèques externes:commons-io etguava.

2. APIIO (avant JDK7)

Tout d'abord,tocopy a file with java.io API, we’re required to open a stream, loop through the content and write it out to another stream:

@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 est nécessaire pour implémenter ces fonctionnalités de base.

Heureusement pour nous,Java has improved its core APIs and we have a simpler way of copying files using NIO.2 API.

3. APINIO.2 (JDK7)

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

Examinons de plus près le fonctionnement de la méthode Files.copy().

La méthodecopy() nous donne la possibilité de spécifier un argument optionnel représentant une option de copie. By default, copying files and directories won’t overwrite existing ones, nor will it copy file attributes.

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 classeNIO.2 Files fournit un ensemble de méthodescopy() surchargées pour copier des fichiers et des répertoires dans le système de fichiers.

Jetons un œil à un exemple utilisantcopy() avec deux argumentsPath:

@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 quedirectory copies are shallow, 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èquecommons-io.

Premièrement, nous devons ajouter la dépendance:


    commons-io
    commons-io
    2.6

La dernière version peut être téléchargée à partir deMaven Central.

Ensuite, pour copier un fichier, il suffit d'utiliser lescopyFile() method defined in the FileUtils class. La méthode prend une source et un fichier cible.

Jetons un œil à un test JUnit utilisant la méthodecopyFile():

@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 peut être trouvéeon 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 méthodes les plus courantes pour copier un fichier en Java.

La mise en œuvre complète de cet article peut être trouvéeover on Github.