Kopier en katalog i Java

1. Introduksjon

I denne korte opplæringen vil vi se hvordan du kopierer en katalog i Java, inkludert alle filene og underkatalogene. Dette kan oppnås ved å bruke kjerne Java-funksjoner eller tredjepartsbiblioteker.

2. Bruke java.nio API

Java NIO har vært tilgjengelig siden Java 1.4. Java 7 introdusert NIO 2 som brakte mange nyttige funksjoner som bedre støtte for håndtering av symbolske lenker, tilgang til filattributter. Det ga oss også klasser som Sti, Stier, og Filer som gjorde filsystemmanipulering mye enklere.

La oss demonstrere denne tilnærmingen:

public static void copyDirectory (String sourceDirectoryLocation, String destinationDirectoryLocation) kaster IOException {Files.walk (Paths.get (sourceDirectoryLocation)) .forEach (source -> {Path destination = Paths.get (destinationDirectoryLocation, source.toString () .substring (sourceDirectoryLocation) .length ())); prøv {Files.copy (kilde, destinasjon);} fange (IOException e) {e.printStackTrace ();}}); }

I dette eksemplet, vi gikk filtreet forankret i den gitte kildekatalogen ved hjelp av Files.walk () og påberopt Files.copy () for hver fil eller katalog vi fant i kildekatalogen.

3. Bruke java.io API

Java 7 var et vendepunkt fra filsystemhåndteringsperspektivet siden det introduserte mange nye nyttige funksjoner.

Men hvis vi ønsker å være kompatible med eldre Java-versjoner, kan vi kopiere en katalog ved hjelp av rekursjon og java.io. fil funksjoner:

privat statisk ugyldig copyDirectory (File sourceDirectory, File destinationDirectory) kaster IOException {if (! destinationDirectory.exists ()) {destinationDirectory.mkdir (); } for (String f: sourceDirectory.list ()) {copyDirectoryCompatibityMode (new File (sourceDirectory, f), new File (destinationDirectory, f)); }}

I dette tilfellet, Vi oppretter en katalog i målkatalogen for hver katalog i kildekatalogtreet. Så påkaller vi copyDirectoryCompatibityMode () metode:

public static void copyDirectoryCompatibityMode (File source, File destination) kaster IOException {if (source.isDirectory ()) {copyDirectory (kilde, destinasjon); } annet {copyFile (kilde, destinasjon); }} 

Også, la oss se hvordan du kopierer en fil ved hjelp av FileInputStream og FileOutputStream:

privat statisk ugyldig copyFile (File sourceFile, File destinationFile) kaster IOException {try (InputStream in = new FileInputStream (sourceFile); OutputStream out = new FileOutputStream (destinationFile)) {byte [] buf = new byte [1024]; int lengde; mens ((length = in.read (buf))> 0) {out.write (buf, 0, length); }}} 

4. Bruke Apache Commons IO

Apache Commons IO har mange nyttige funksjoner som verktøyklasser, filfiltre og filkomparatorer. Her skal vi bruke FileUtils som gir metoder for enkel fil- og katalogmanipulering, dvs. lese, flytte, kopiere.

La oss legge til commons-io til vår pom.xml fil:

 commons-io commons-io 2.7 

Til slutt, la oss kopiere en katalog ved hjelp av denne tilnærmingen:

public static void copyDirectory (String sourceDirectoryLocation, String destinationDirectoryLocation) kaster IOException {File sourceDirectory = new File (sourceDirectoryLocation); File destinationDirectory = ny fil (destinationDirectoryLocation); FileUtils.copyDirectory (sourceDirectory, destinationDirectory); }

Som vist i forrige eksempel, gjør Apache Commons IO det hele mye enklere siden vi trenger bare å ringe FileUtils.copyDirectory () metode.

5. Konklusjon

Denne artikkelen illustrerte hvordan du kopierer en katalog i Java. Komplette kodeeksempler er tilgjengelig på GitHub.