Hoe een bestand te kopiëren met Java

1. Overzicht

In dit artikel bespreken we veelgebruikte manieren om bestanden in Java te kopiëren.

Eerst gebruiken we de standaard IO en NIO.2 API's en twee externe bibliotheken: commons-io en guava.

2. IO API (vóór JDK7)

Allereerst, naarkopieer een bestand met java.io API, we moeten een stream openen, de inhoud doorlopen en naar een andere stream schrijven:

@Test openbare leegte gegevenIoAPI_whenCopied_thenCopyExistsWithSameContents () gooit IOException {File copied = new File ("src / test / resources / copiedWithIo.txt"); probeer (InputStream in = nieuwe BufferedInputStream (nieuwe FileInputStream (origineel)); OutputStream uit = nieuwe BufferedOutputStream (nieuwe FileOutputStream (gekopieerd))) {byte [] buffer = nieuwe byte [1024]; int lengthRead; while ((lengthRead = in.read (buffer))> 0) {out.write (buffer, 0, lengthRead); out.flush (); }} assertThat (gekopieerd) .exists (); assertThat (Files.readAllLines (original.toPath ()) .equals (Files.readAllLines (copied.toPath ()))); }

Heel veel werk om dergelijke basisfunctionaliteit te implementeren.

Gelukkig voor ons, Java heeft zijn kern-API's verbeterd en we hebben een eenvoudigere manier om bestanden te kopiëren met NIO.2 API.

3. NIO.2 API (JDK7)

Gebruik makend van NIO.2 kan de prestaties bij het kopiëren van bestanden aanzienlijk verbeteren sinds de NIO.2 maakt gebruik van systeemingangspunten op een lager niveau.

Laten we eens nader bekijken hoe de bestanden.kopiëren() methode werkt.

De kopiëren() methode geeft ons de mogelijkheid om een ​​optioneel argument op te geven dat een kopieeroptie vertegenwoordigt. Standaard worden bij het kopiëren van bestanden en mappen de bestaande niet overschreven, noch worden er bestandskenmerken gekopieerd.

Dit gedrag kan worden gewijzigd met de volgende kopieeropties:

  • VERVANG BESTAANDE - vervang een bestand als het bestaat
  • COPY_ATTRIBUTES - kopieer metadata naar het nieuwe bestand
  • NOFOLLOW_LINKS - mag geen symbolische links volgen

De NIO.2-bestanden klasse biedt een set overbelast kopiëren() methoden voor het kopiëren van bestanden en mappen binnen het bestandssysteem.

Laten we een voorbeeld bekijken met kopiëren() met twee Pad argumenten:

@Test openbare leegte gegevenNIO2_whenCopied_thenCopyExistsWithSameContents () gooit IOException {Path copied = Paths.get ("src / test / resources / copiedWithNio.txt"); Pad originalPath = original.toPath (); Files.copy (originalPath, gekopieerd, StandardCopyOption.REPLACE_EXISTING); assertThat (gekopieerd) .exists (); assertThat (Files.readAllLines (originalPath) .equals (Files.readAllLines (gekopieerd))); }

Let daar op directory-kopieën zijn oppervlakkig, wat betekent dat bestanden en submappen binnen de map niet worden gekopieerd.

4. Apache Commons IO

Een andere veelgebruikte manier om een ​​bestand met Java te kopiëren, is door de commons-io bibliotheek.

Eerst moeten we de afhankelijkheid toevoegen:

 commons-io commons-io 2.6 

De nieuwste versie kan worden gedownload van Maven Central.

Om een ​​bestand te kopiëren, hoeven we alleen deKopieer bestand() methode gedefinieerd in de FileUtils klasse. De methode gebruikt een bron- en een doelbestand.

Laten we eens kijken naar een JUnit-test met behulp van de Kopieer bestand() methode:

@Test openbare leegte gegevenCommonsIoAPI_whenCopied_thenCopyExistsWithSameContents () gooit IOException {File copied = new File ("src / test / resources / copiedWithApacheCommons.txt"); FileUtils.copyFile (origineel, gekopieerd); assertThat (gekopieerd) .exists (); assertThat (Files.readAllLines (original.toPath ()) .equals (Files.readAllLines (copied.toPath ()))); }

5. Guave

Ten slotte bekijken we de Guava-bibliotheek van Google.

Nogmaals, als we Guava willen gebruiken, we moeten de afhankelijkheid opnemen:

 com.google.guava guave 23.0 

De nieuwste versie is te vinden op Maven Central.

En hier is de Guava's manier om een ​​bestand te kopiëren:

@Test openbare ongeldige gegevenGuava_whenCopied_thenCopyExistsWithSameContents () gooit IOException {File copied = new File ("src / test / resources / copiedWithGuava.txt"); com.google.common.io.Files.copy (origineel, gekopieerd); assertThat (gekopieerd) .exists (); assertThat (Files.readAllLines (original.toPath ()) .equals (Files.readAllLines (copied.toPath ()))); }

6. Conclusie

In dit artikel hebben we de meest gebruikelijke manieren onderzocht om een ​​bestand in Java te kopiëren.

De volledige implementatie van dit artikel is te vinden op Github.