Kako kopirati datoteku s Javom

1. Pregled

U ovom ćemo članku pokriti uobičajene načine kopiranja datoteka na Javi.

Prvo ćemo se poslužiti standardom IO i NIO.2 API-ji i dvije vanjske knjižnice: commons-io i guava.

2. IO API (prije JDK7)

Kao prvo, dokopirajte datoteku pomoću java.io API, mi moramo otvoriti stream, provući se kroz sadržaj i zapisati ga u drugi stream:

@Test javna praznina givenIoAPI_whenCopied_thenCopyExistsWithSameContents () baca IOException {Datoteka je kopirana = nova datoteka ("src / test / resources / copiedWithIo.txt"); probajte (InputStream u = novi BufferedInputStream (novi FileInputStream (original)); OutputStream out = novi BufferedOutputStream (novi FileOutputStream (kopiran))) {byte [] buffer = new byte [1024]; int lengthRead; while ((lengthRead = in.read (buffer))> 0) {out.write (buffer, 0, lengthRead); out.flush (); }} assertThat (kopirano) .postoji (); assertThat (Files.readAllLines (original.toPath ()) .equals (Files.readAllLines (kopirano.toPath ()))); }

Poprilično posla za implementaciju takve osnovne funkcionalnosti.

Srećom po nas, Java je poboljšala svoje osnovne API-je i imamo jednostavniji način kopiranja datoteka pomoću NIO.2 API.

3. NIO.2 API (JDK7)

Koristeći NIO.2 može značajno povećati performanse kopiranja datoteka od NIO.2 koristi ulazne točke sustava niže razine.

Pogledajmo pobliže kako Datoteke.kopirati() metoda djeluje.

The kopirati() metoda daje nam mogućnost da odredimo neobavezni argument koji predstavlja opciju kopiranja. Prema zadanim postavkama kopiranje datoteka i direktorija neće prebrisati postojeće niti kopirati atribute datoteka.

Ovo se ponašanje može promijeniti pomoću sljedećih opcija kopiranja:

  • ZAMJENA_POSTOJEĆE - zamijenite datoteku ako postoji
  • COPY_ATTRIBUTES - kopirajte metapodatke u novu datoteku
  • NOFOLLOW_LINKS - ne bi trebali slijediti simboličke poveznice

The NIO.2 Datoteke klasa pruža skup preopterećenih kopirati() metode kopiranja datoteka i direktorija unutar datotečnog sustava.

Pogledajmo primjer pomoću kopirati() s dvoje Staza argumenti:

@Test public void givenNIO2_whenCopied_thenCopyExistsWithSameContents () baca IOException {Path copy = Paths.get ("src / test / resources / copiedWithNio.txt"); Put originalPath = original.toPath (); Files.copy (originalPath, kopirano, StandardCopyOption.REPLACE_EXISTING); assertThat (kopirano) .postoji (); assertThat (Files.readAllLines (originalPath) .equals (Files.readAllLines (kopirano))); }

Imajte na umu da kopije direktorija su plitke, što znači da se datoteke i poddirektoriji unutar direktorija ne kopiraju.

4. Apache Commons IO

Drugi uobičajeni način kopiranja datoteke s Javom je korištenje datoteke zajedničko-io knjižnica.

Prvo, moramo dodati ovisnost:

 commons-io commons-io 2.6 

Najnoviju verziju možete preuzeti s Maven Central.

Zatim, za kopiranje datoteke samo trebamo upotrijebiticopyFile () metoda definirana u FileUtils razred. Metoda uzima izvornu i ciljnu datoteku.

Pogledajmo JUnit test pomoću copyFile () metoda:

@Test javna praznina givenCommonsIoAPI_whenCopied_thenCopyExistsWithSameContents () baca IOException {Datoteka je kopirana = nova datoteka ("src / test / resources / copiedWithApacheCommons.txt"); FileUtils.copyFile (izvornik, kopiran); assertThat (kopirano) .postoji (); assertThat (Files.readAllLines (original.toPath ()) .equals (Files.readAllLines (kopirano.toPath ()))); }

5. Guava

Na kraju ćemo pogledati Googleovu knjižnicu Guava.

Opet, ako želimo koristiti Guavu, moramo uključiti ovisnost:

 com.google.guava guava 23.0 

Najnoviju verziju možete pronaći na Maven Central.

Evo i Guavinog načina kopiranja datoteke:

@Test javna praznina givenGuava_whenCopied_thenCopyExistsWithSameContents () baca IOException {Datoteka je kopirana = nova datoteka ("src / test / resources / copiedWithGuava.txt"); com.google.common.io.Files.copy (izvornik, kopiran); assertThat (kopirano) .postoji (); assertThat (Files.readAllLines (original.toPath ()) .equals (Files.readAllLines (copy.toPath ()))); }

6. Zaključak

U ovom smo članku istražili najčešće načine kopiranja datoteke u Javi.

Potpuna provedba ovog članka nalazi se na Githubu.