So kopieren Sie eine Datei mit Java

1. Übersicht

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

Zunächst werden wir den Standard verwenden IO und NIO.2 APIs und zwei externe Bibliotheken: commons-io und Guave.

2. IO API (Vor JDK7)

Zunächst einmal, um eine Datei mit zu kopieren java.io API, wir erforderlich , um einen Strom, eine Schleife durch den Inhalt zu öffnen und schreiben an einem anderen Strom aus:

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

Ziemlich viel Arbeit, um solche grundlegenden Funktionen zu implementieren.

Zum Glück hat Java seine Kern-APIs verbessert und wir haben eine einfachere Möglichkeit, Dateien mit der NIO.2- API zu kopieren .

3. NIO.2 API (JDK7)

Die Verwendung von NIO.2 kann die Leistung beim Kopieren von Dateien erheblich steigern, da NIO.2 untergeordnete Systemeinstiegspunkte verwendet.

Schauen wir uns die Dateien genauer an. Die Methode copy () funktioniert.

Mit der copy () -Methode können wir ein optionales Argument angeben, das eine Kopieroption darstellt. Standardmäßig werden beim Kopieren von Dateien und Verzeichnissen weder vorhandene überschrieben noch Dateiattribute kopiert.

Dieses Verhalten kann mithilfe der folgenden Kopieroptionen geändert werden:

  • REPLACE_EXISTING - Ersetzen Sie eine Datei, falls vorhanden
  • COPY_ATTRIBUTES - Kopieren Sie Metadaten in die neue Datei
  • NOFOLLOW_LINKS - sollte keinen symbolischen Links folgen

Die NIO.2 Files- Klasse bietet eine Reihe überladener copy () -Methoden zum Kopieren von Dateien und Verzeichnissen innerhalb des Dateisystems.

Schauen wir uns ein Beispiel mit copy () mit zwei Pfadargumenten 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, dass Verzeichniskopien flach sind , was 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 Commons-Io- Bibliothek.

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

 commons-io commons-io 2.6 

Die neueste Version kann von Maven Central heruntergeladen werden.

Um eine Datei zu kopieren, müssen Sie nur die in der FileUtils- Klasse definierte copyFile () -Methode verwenden . Die Methode verwendet eine Quell- und eine Zieldatei.

Schauen wir uns einen JUnit-Test mit der copyFile () -Methode 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

Zum Schluss 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 auf 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 auf Github.