Ako kopírovať súbor pomocou Java

1. Prehľad

V tomto článku sa budeme venovať bežným spôsobom kopírovania súborov v prostredí Java.

Najprv použijeme štandard IO a NIO.2 API a dve externé knižnice: commons-io a guava.

2. IO API (pred JDK7)

Po prvé, doskopírovať súbor s java.io API, je potrebné, aby sme otvorili stream, prešli obsah a prepísali ho do iného streamu:

@ Test public void givenIoAPI_whenCopied_thenCopyExistsWithSameContents () vyvolá IOException {File copied = new File ("src / test / resources / copiedWithIo.txt"); try (InputStream in = new BufferedInputStream (new FileInputStream (original)); OutputStream out = new BufferedOutputStream (new FileOutputStream (copied))) {byte [] buffer = new byte [1024]; int lengthRead; while ((lengthRead = in.read (buffer))> 0) {out.write (buffer, 0, lengthRead); out.flush (); }} assertThat (skopírované). existuje (); assertThat (Files.readAllLines (original.toPath ()) .equals (Files.readAllLines (copied.toPath ()))); }

Na implementácii takejto základnej funkčnosti je dosť veľa práce.

Našťastie pre nás, Java vylepšila svoje základné API a máme jednoduchší spôsob kopírovania súborov pomocou NIO.2 API.

3. NIO.2 API (JDK7)

Použitím NIO.2 môže výrazne zvýšiť výkon pri kopírovaní súborov od NIO.2 využíva vstupné body systému nižšej úrovne.

Pozrime sa bližšie na to, ako fungujú súbory.copy () metóda funguje.

The copy () metóda nám dáva možnosť určiť voliteľný argument predstavujúci voľbu kopírovania. V predvolenom nastavení kopírovanie súborov a adresárov neprepíše existujúce ani atribúty súborov.

Toto správanie je možné zmeniť pomocou nasledujúcich možností kopírovania:

  • REPLACE_EXISTING - nahraďte súbor, ak existuje
  • COPY_ATTRIBUTES - skopírovať metadáta do nového súboru
  • NOFOLLOW_LINKS - by nemali nasledovať symbolické odkazy

The Súbory NIO.2 triedy poskytuje sadu preťažených copy () metódy kopírovania súborov a adresárov v rámci súborového systému.

Pozrime sa na príklad použitia copy () s dvoma Cesta argumenty:

@Test public void givenNIO2_whenCopied_thenCopyExistsWithSameContents () vyvolá IOException {Path copied = Paths.get ("src / test / resources / copiedWithNio.txt"); Cesta originalPath = original.toPath (); Files.copy (originalPath, skopírované, StandardCopyOption.REPLACE_EXISTING); tvrdiťTo (kopírované). existuje (); assertThat (Files.readAllLines (originalPath) .equals (Files.readAllLines (skopírované))); }

Poznač si to kópie adresárov sú plytké, čo znamená, že súbory a podadresáre v adresári sa nekopírujú.

4. Apache Commons IO

Ďalším bežným spôsobom, ako kopírovať súbor v prostredí Java, je použitie súboru commons-io knižnica.

Najprv musíme pridať závislosť:

 commons-io commons-io 2.6 

Najnovšiu verziu je možné stiahnuť z Maven Central.

Potom na kopírovanie súboru stačí použiťcopyFile () metóda definovaná v FileUtils trieda. Metóda berie zdrojový a cieľový súbor.

Pozrime sa na test JUnit pomocou copyFile () metóda:

@Test public void givenCommonsIoAPI_whenCopied_thenCopyExistsWithSameContents () hodí IOException {File copied = new File ("src / test / resources / copiedWithApacheCommons.txt"); FileUtils.copyFile (originál, kopírovanie); tvrdiťTo (kopírované). existuje (); assertThat (Files.readAllLines (original.toPath ()) .equals (Files.readAllLines (copied.toPath ()))); }

5. Guava

Na záver sa pozrieme do knižnice Guava spoločnosti Google.

Opäť, ak chceme použiť Guavu, musíme zahrnúť závislosť:

 com.google.guava guava 23.0 

Najnovšiu verziu nájdete na serveri Maven Central.

A tu je spôsob kopírovania súboru z Guavy:

@Test public void givenGuava_whenCopied_thenCopyExistsWithSameContents () vyvolá IOException {File copied = new File ("src / test / resources / copiedWithGuava.txt"); com.google.common.io.Files.copy (originál, kopírovanie); tvrdiťTo (kopírované). existuje (); assertThat (Files.readAllLines (original.toPath ()) .equals (Files.readAllLines (copied.toPath ()))); }

6. Záver

V tomto článku sme preskúmali najbežnejšie spôsoby kopírovania súboru v prostredí Java.

Celú implementáciu tohto článku nájdete na stránkach Github.


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