So kopieren Sie eine Datei mit Java

So kopieren Sie eine Datei mit Java

1. Überblick

In diesem Artikel werden allgemeine Methoden zum Kopieren von Dateien in Java beschrieben.

Zunächst verwenden wir die Standard-APIsIO undNIO.2 sowie zwei externe Bibliotheken:commons-io undguava.

2. IO API (vor JDK7)

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

Es ist ziemlich viel Arbeit, solche grundlegenden Funktionen zu implementieren.

Zum Glück für unsJava has improved its core APIs and we have a simpler way of copying files using NIO.2 API.

3. NIO.2 API (JDK7)

Die Verwendung vonNIO.2 kann die Kopierleistung von Dateien erheblich steigern, daNIO.2 untergeordnete Systemeinstiegspunkte verwendet.

Schauen wir uns die Funktionsweise der Methode "Dateien.copy()" genauer an.

Mit der Methodecopy()können wir ein optionales Argument angeben, das eine Kopieroption darstellt. By default, copying files and directories won’t overwrite existing ones, nor will it copy file attributes.

Dieses Verhalten kann mit den folgenden Kopieroptionen geändert werden:

  • REPLACE_EXISTING – ersetzen eine Datei, falls vorhanden

  • COPY_ATTRIBUTES – kopieren Metadaten in die neue Datei

  • NOFOLLOW_LINKS – sollten keinen symbolischen Links folgen

Die KlasseNIO.2 Files bietet eine Reihe überladener Methodencopy()zum Kopieren von Dateien und Verzeichnissen innerhalb des Dateisystems.

Schauen wir uns ein Beispiel mitcopy() mit zweiPath Argumenten an:

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

Beachten Sie, dassdirectory copies are shallow bedeutet, dass Dateien und Unterverzeichnisse innerhalb des Verzeichnisses nicht kopiert werden.

4. Apache Commons IO

Eine andere übliche Methode zum Kopieren einer Datei mit Java ist die Verwendung der Bibliothekcommons-io.

Zuerst müssen wir die Abhängigkeit hinzufügen:


    commons-io
    commons-io
    2.6

Die neueste Version kann vonMaven Central heruntergeladen werden.

Um eine Datei zu kopieren, müssen Sie nurcopyFile() method defined in the FileUtils class. verwenden. Die Methode verwendet eine Quell- und eine Zieldatei.

Schauen wir uns einen JUnit-Test mit der MethodecopyFile()an:

@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. Guave

Abschließend werfen wir einen Blick auf die Guava-Bibliothek von Google.

Wenn wir Guava, verwenden möchten, müssen wir die Abhängigkeit einschließen:


    com.google.guava
    guava
    23.0

Die neueste Version finden Sie unteron Maven Central.

Und hier ist die Art und Weise, wie die Guave eine Datei kopiert:

@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. Fazit

In diesem Artikel haben wir die gängigsten Methoden zum Kopieren einer Datei in Java untersucht.

Die vollständige Implementierung dieses Artikels finden Sie inover on Github.