Hvordan kopiere en fil med Java

1. Oversikt

I denne artikkelen vil vi dekke vanlige måter å kopiere filer på Java på.

Først bruker vi standarden IO og NIO.2 APIer og to eksterne biblioteker: commons-io og guava.

2. IO API (før JDK7)

Først av alt, tilkopiere en fil med java.io API, vi må åpne en strøm, gå gjennom innholdet og skrive den ut til en annen strøm:

@Test offentlig ugyldighet givenIoAPI_whenCopied_thenCopyExistsWithSameContents () kaster IOException {File copied = new File ("src / test / resources / copiedWithIo.txt"); prøv (InputStream inn = ny BufferedInputStream (ny FileInputStream (original)); OutputStream ut = ny BufferedOutputStream (ny FileOutputStream (kopiert))) {byte [] buffer = ny byte [1024]; int lengdeLes; mens ((lengthRead = in.read (buffer))> 0) {out.write (buffer, 0, lengthRead); ut.flush (); }} assertThat (kopiert) .exists (); assertThat (Files.readAllLines (original.toPath ()) .equals (Files.readAllLines (copied.toPath ()))); }

Ganske mye arbeid med å implementere en slik grunnleggende funksjonalitet.

Heldigvis for oss, Java har forbedret sine kjerne-API-er, og vi har en enklere måte å kopiere filer på NIO.2 API.

3. NIO.2 API (JDK7)

Ved hjelp av NIO.2 kan øke ytelsen til filkopiering betydelig siden NIO.2 benytter systeminngangspunkter på lavere nivå.

La oss se nærmere på hvordan filene.kopiere() metoden fungerer.

De kopiere() metoden gir oss muligheten til å spesifisere et valgfritt argument som representerer et kopieringsalternativ. Kopiering av filer og kataloger overskriver som standard ikke eksisterende, og det kopieres heller ikke filattributter.

Denne oppførselen kan endres ved hjelp av følgende kopieringsalternativer:

  • REPLACE_EXISTING - erstatte en fil hvis den eksisterer
  • COPY_ATTRIBUTES - kopier metadata til den nye filen
  • NOFOLLOW_LINKS - bør ikke følge symbolske lenker

De NIO.2-filer klasse gir et sett med overbelastet kopiere() metoder for å kopiere filer og kataloger i filsystemet.

La oss ta en titt på et eksempel ved hjelp av kopiere() med to Sti argumenter:

@Test offentlig ugyldighet gittNIO2_whenCopied_thenCopyExistsWithSameContents () kaster IOException {Path copied = Paths.get ("src / test / resources / copiedWithNio.txt"); Sti originalPath = original.toPath (); Files.copy (originalPath, kopiert, StandardCopyOption.REPLACE_EXISTING); assertThat (kopiert) .eksisterer (); assertThat (Files.readAllLines (originalPath) .equals (Files.readAllLines (kopiert))); }

Noter det katalogkopier er grunne, noe som betyr at filer og underkataloger i katalogen ikke kopieres.

4. Apache Commons IO

En annen vanlig måte å kopiere en fil med Java er ved å bruke commons-io bibliotek.

Først må vi legge til avhengighet:

 commons-io commons-io 2.6 

Den siste versjonen kan lastes ned fra Maven Central.

For å kopiere en fil trenger vi bare å brukeKopier fil() metoden definert i FileUtils klasse. Metoden tar en kilde og en målfil.

La oss ta en titt på en JUnit-test ved hjelp av Kopier fil() metode:

@Test offentlig ugyldighet gittCommonsIoAPI_whenCopied_thenCopyExistsWithSameContents () kaster IOException {File copied = new File ("src / test / resources / copiedWithApacheCommons.txt"); FileUtils.copyFile (original, kopiert); assertThat (kopiert) .eksisterer (); assertThat (Files.readAllLines (original.toPath ()) .equals (Files.readAllLines (copied.toPath ()))); }

5. Guava

Til slutt tar vi en titt på Googles Guava-bibliotek.

Igjen, hvis vi vil bruke Guava, vi må inkludere avhengighet:

 com.google.guava guava 23.0 

Den siste versjonen finner du på Maven Central.

Og her er Guavas måte å kopiere en fil på:

@Test offentlig ugyldighet gittGuava_whenCopied_thenCopyExistsWithSameContents () kaster IOException {File copied = new File ("src / test / resources / copiedWithGuava.txt"); com.google.common.io.Files.copy (original, kopiert); assertThat (kopiert) .eksisterer (); assertThat (Files.readAllLines (original.toPath ()) .equals (Files.readAllLines (copied.toPath ()))); }

6. Konklusjon

I denne artikkelen undersøkte vi de vanligste måtene å kopiere en fil på Java.

Den fulle implementeringen av denne artikkelen finner du på Github.


$config[zx-auto] not found$config[zx-overlay] not found