Cara Menyalin Fail dengan Java

1. Gambaran keseluruhan

Dalam artikel ini, kita akan membahas cara-cara umum menyalin fail di Java.

Pertama, kami akan menggunakan API IO dan NIO.2 standard , dan dua perpustakaan luaran: commons-io dan jambu batu.

2. API IO (Sebelum JDK7)

Pertama sekali, untuk menyalin fail dengan API java.io , kami diminta untuk membuka aliran, melingkari kandungan dan menulisnya ke aliran lain:

@Test public void givenIoAPI_whenCopied_thenCopyExistsWithSameContents() throws 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(copied).exists(); assertThat(Files.readAllLines(original.toPath()) .equals(Files.readAllLines(copied.toPath()))); }

Cukup banyak kerja untuk melaksanakan fungsi asas tersebut.

Nasib baik bagi kami, Java telah meningkatkan API terasnya dan kami mempunyai cara yang lebih mudah untuk menyalin fail menggunakan NIO.2 API .

3. NIO.2 API (JDK7)

Menggunakan NIO.2 dapat meningkatkan prestasi penyalinan fail dengan ketara kerana NIO.2 menggunakan titik masuk sistem peringkat rendah.

Mari kita perhatikan lebih dekat bagaimana Fail. kaedah copy () berfungsi.

Kaedah salin () memberi kita kemampuan untuk menentukan argumen pilihan yang mewakili pilihan salinan. Secara lalai, menyalin fail dan direktori tidak akan menimpa yang ada, dan juga tidak akan menyalin atribut fail.

Tingkah laku ini boleh diubah menggunakan pilihan salinan berikut:

  • REPLACE_EXISTING - ganti fail jika ada
  • COPY_ATTRIBUTES - salin metadata ke fail baru
  • NOFOLLOW_LINKS - tidak boleh mengikuti pautan simbolik

The NIO.2 Files kelas menyediakan satu set beban salinan () kaedah untuk menyalin fail dan direktori dalam sistem fail.

Mari kita lihat contoh menggunakan copy () dengan dua argumen Path :

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

Perhatikan bahawa salinan direktori adalah cetek , yang bermaksud bahawa fail dan sub-direktori dalam direktori tidak disalin.

4. Apache Commons IO

Cara lain untuk menyalin fail dengan Java adalah dengan menggunakan library commons-io .

Pertama, kita perlu menambahkan kebergantungan:

 commons-io commons-io 2.6 

Versi terbaru boleh dimuat turun dari Maven Central.

Kemudian, untuk menyalin fail, kita hanya perlu menggunakan kaedah copyFile () yang ditentukan dalam kelas FileUtils . Kaedah mengambil sumber dan fail sasaran.

Mari kita lihat ujian JUnit menggunakan kaedah copyFile () :

@Test public void givenCommonsIoAPI_whenCopied_thenCopyExistsWithSameContents() throws IOException { File copied = new File( "src/test/resources/copiedWithApacheCommons.txt"); FileUtils.copyFile(original, copied); assertThat(copied).exists(); assertThat(Files.readAllLines(original.toPath()) .equals(Files.readAllLines(copied.toPath()))); }

5. Jambu batu

Akhirnya, kita akan melihat perpustakaan Jambu Batu Google.

Sekali lagi, jika kita ingin menggunakan Jambu Batu , kita perlu memasukkan kebergantungan:

 com.google.guava guava 23.0 

Versi terbaru boleh didapati di Maven Central.

Dan inilah cara Jambu untuk menyalin fail:

@Test public void givenGuava_whenCopied_thenCopyExistsWithSameContents() throws IOException { File copied = new File("src/test/resources/copiedWithGuava.txt"); com.google.common.io.Files.copy(original, copied); assertThat(copied).exists(); assertThat(Files.readAllLines(original.toPath()) .equals(Files.readAllLines(copied.toPath()))); }

6. Kesimpulannya

Dalam artikel ini, kami meneroka cara yang paling umum untuk menyalin fail di Java.

Pelaksanaan penuh artikel ini boleh didapati di Github.