Sådan kopieres en fil med Java

1. Oversigt

I denne artikel dækker vi almindelige måder til kopiering af filer i Java.

Først bruger vi standarden IO og NIO.2 API'er og to eksterne biblioteker: commons-io og guava.

2. IO API (før JDK7)

Først og fremmest, tilkopiere en fil med java.io API, vi kræves for at åbne en stream, gennemgå indholdet og skrive det ud til en anden stream:

@Test offentlig ugyldighed givenIoAPI_whenCopied_thenCopyExistsWithSameContents () kaster IOException {File copied = new File ("src / test / resources / copiedWithIo.txt"); prøv (InputStream in = ny BufferedInputStream (ny FileInputStream (original)); OutputStream out = ny BufferedOutputStream (ny FileOutputStream (kopieret))) {byte [] buffer = ny byte [1024]; int længdeLæs; mens ((lengthRead = in.read (buffer))> 0) {out.write (buffer, 0, lengthRead); out.flush (); }} hævder, at (kopieret) .eksisterer (); assertThat (Files.readAllLines (original.toPath ()) .equals (Files.readAllLines (kopieret.toPath ()))); }

En hel del arbejde med at implementere sådan grundlæggende funktionalitet.

Heldigvis for os, Java har forbedret sine centrale API'er, og vi har en enklere måde at kopiere filer ved hjælp af NIO.2 API.

3. NIO.2 API (JDK7)

Ved brug af NIO.2 kan øge filkopieringens ydeevne betydeligt siden NIO.2 bruger systemindgangspunkter på lavere niveau.

Lad os se nærmere på, hvordan filerne.kopi() metoden fungerer.

Det kopi() metode giver os muligheden for at specificere et valgfrit argument, der repræsenterer en kopiindstilling. Som standard overskriver kopiering af filer og mapper ikke eksisterende, og det kopieres heller ikke filattributter.

Denne adfærd kan ændres ved hjælp af følgende kopimuligheder:

  • REPLACE_EXISTING - udskift en fil, hvis den findes
  • COPY_ATTRIBUTES - kopier metadata til den nye fil
  • NOFOLLOW_LINKS - bør ikke følge symbolske links

Det NIO.2 filer klasse giver et sæt overbelastet kopi() metoder til kopiering af filer og mapper i filsystemet.

Lad os se på et eksempel ved hjælp af kopi() med to Sti argumenter:

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

Noter det katalogkopier er overfladiske, hvilket betyder at filer og underkataloger i biblioteket ikke kopieres.

4. Apache Commons IO

En anden almindelig måde at kopiere en fil med Java er ved hjælp af commons-io bibliotek.

Først skal vi tilføje afhængighed:

 commons-io commons-io 2.6 

Den seneste version kan downloades fra Maven Central.

For at kopiere en fil skal vi bare brugecopyFile () metode defineret i FileUtils klasse. Metoden tager en kilde og en målfil.

Lad os se på en JUnit-test ved hjælp af copyFile () metode:

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

5. Guava

Endelig ser vi på Googles Guava-bibliotek.

Igen, hvis vi vil bruge Guava, vi er nødt til at inkludere afhængighed:

 com.google.guava guava 23.0 

Den seneste version kan findes på Maven Central.

Og her er Guavas måde at kopiere en fil på:

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

6. Konklusion

I denne artikel undersøgte vi de mest almindelige måder at kopiere en fil på Java.

Den fulde implementering af denne artikel kan findes på Github.