Fájl másolása Java-val

1. Áttekintés

Ebben a cikkben a Java-fájlok másolásának általános módjaival foglalkozunk.

Először a szabványt fogjuk használni IO és NIO.2 API-k és két külső könyvtár: commons-io és guava.

2. IO API (JDK7 előtt)

Először is, nak nekmásoljon egy fájlt a java.io API, meg kell nyitnunk egy adatfolyamot, végig kell vinnünk a tartalmat, és ki kell írnunk egy másik adatfolyamba:

@Test public void givenIoAPI_whenCopied_thenCopyExistsWithSameContents () dobja az IOException {File copy = new File ("src / test / resources / copiedWithIo.txt"); próbálkozzon (InputStream in = új BufferedInputStream (új FileInputStream (eredeti)); OutputStream out = új BufferedOutputStream (új FileOutputStream (másolva))) {byte [] buffer = new byte [1024]; int lengthRead; while ((lengthRead = beolvasott (puffer))> 0) {out.write (puffer, 0, lengthRead); ki.öblítés (); }} assertThat (másolva). létezik (); assertThat (Files.readAllLines (original.toPath ()) .equals (Files.readAllLines (copy.toPath ()))); }

Elég sok munka az ilyen alapvető funkciók megvalósításán.

Szerencsénkre, A Java fejlesztette az alapvető API-kat, és egyszerűbb módszerünk van a fájlok másolására NIO.2 API.

3. NIO.2 API (JDK7)

Használata NIO.2 jelentősen növelheti a fájlmásolási teljesítményt a NIO.2 alacsonyabb szintű rendszer belépési pontokat használ.

Vizsgáljuk meg közelebbről a fájlok működését.másolat() módszer működik.

A másolat() A módszer lehetővé teszi számunkra, hogy megadjon egy opcionális argumentumot, amely egy másolási opciót képvisel. Alapértelmezés szerint a fájlok és könyvtárak másolása nem írja felül a meglévőket, és nem másolja a fájlattribútumokat sem.

Ez a viselkedés a következő másolási lehetőségekkel módosítható:

  • REPLACE_EXISTING - cserélje ki a fájlt, ha létezik
  • COPY_ATTRIBUTES - metaadatokat másoljon az új fájlba
  • NOFOLLOW_LINKS - nem követhet szimbolikus linkeket

A NIO.2 fájlok osztály nyújt egy sor túlterheltet másolat() a fájlok és könyvtárak fájlrendszeren belüli másolásának módszerei.

Nézzünk meg egy példát a használatával másolat() kettővel Pálya érvek:

@Test public void givenNIO2_whenCopied_thenCopyExistsWithSameContents () dobja az IOException {Path copied = Paths.get ("src / test / resources / copiedWithNio.txt"); Path originalPath = original.toPath (); Files.copy (originalPath, másolt, StandardCopyOption.REPLACE_EXISTING); assertThat (másolva). létezik (); assertThat (Files.readAllLines (originalPath) .equals (Files.readAllLines (másolva))); }

Vegye figyelembe, hogy a névjegyzéki példányok sekélyek, ami azt jelenti, hogy a könyvtárban lévő fájlokat és alkönyvtárakat nem másolják.

4. Apache Commons IO

A fájl Java-ra másolásának másik gyakori módja a commons-io könyvtár.

Először hozzá kell adnunk a függőséget:

 commons-io commons-io 2.6 

A legújabb verzió letölthető a Maven Central oldalról.

Ezután egy fájl másolásához csak afájl másolás, fájl másolása() módszerben meghatározott módszer FileUtils osztály. A módszer forrást és célfájlt vesz fel.

Vessen egy pillantást egy JUnit tesztre a fájl másolás, fájl másolása() módszer:

@Test public void givenCommonsIoAPI_whenCopied_thenCopyExistsWithSameContents () dobja az IOException {File copy = new File ("src / test / resources / copiedWithApacheCommons.txt"); FileUtils.copyFile (eredeti, másolt); assertThat (másolva). létezik (); assertThat (Files.readAllLines (original.toPath ()) .equals (Files.readAllLines (copy.toPath ()))); }

5. Guava

Végül megnézzük a Google Guava könyvtárát.

Ismételten, ha Guavát akarunk használni, bele kell foglalnunk a függőséget:

 com.google.guava guava 23.0 

A legújabb verzió megtalálható a Maven Central oldalon.

És itt van a Guava módja egy fájl másolására:

@Test public void givenGuava_whenCopied_thenCopyExistsWithSameContents () dobja az IOException {File copy = new File ("src / test / resources / copiedWithGuava.txt"); com.google.common.io.Files.copy (eredeti, másolt); assertThat (másolva). létezik (); assertThat (Files.readAllLines (original.toPath ()) .equals (Files.readAllLines (copy.toPath ()))); }

6. Következtetés

Ebben a cikkben a fájl Java másolásának leggyakoribb módjait tártuk fel.

A cikk teljes megvalósítása a Github oldalon található.