Cara Menyalin File dengan Java

1. Ikhtisar

Di artikel ini, kami akan membahas cara umum menyalin file di Java.

Pertama, kita akan menggunakan API IO dan NIO.2 standar , dan dua pustaka eksternal: commons-io dan guava.

2. IO API (Sebelum JDK7)

Pertama-tama, untuk menyalin file dengan java.io API, kita diharuskan membuka aliran, memutar melalui konten, 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 pekerjaan untuk mengimplementasikan fungsi dasar seperti itu.

Beruntung bagi kami, Java telah meningkatkan API intinya dan kami memiliki cara yang lebih sederhana untuk menyalin file menggunakan NIO.2 API .

3. NIO.2 API (JDK7)

Menggunakan NIO.2 dapat secara signifikan meningkatkan kinerja penyalinan file karena NIO.2 menggunakan titik masuk sistem tingkat yang lebih rendah.

Mari kita lihat lebih dekat bagaimana Files. copy () metode bekerja.

Metode copy () memberi kita kemampuan untuk menentukan argumen opsional yang mewakili opsi salin. Secara default, menyalin file dan direktori tidak akan menimpa yang sudah ada, juga tidak akan menyalin atribut file.

Perilaku ini dapat diubah menggunakan opsi salin berikut:

  • REPLACE_EXISTING - mengganti file jika ada
  • COPY_ATTRIBUTES - menyalin metadata ke file baru
  • NOFOLLOW_LINKS - tidak boleh mengikuti tautan simbolis

Kelas NIO.2 Files menyediakan sekumpulan metode copy () yang kelebihan beban untuk menyalin file dan direktori di dalam sistem file.

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 bahwa salinan direktori bersifat dangkal , artinya file dan sub-direktori di dalam direktori tidak disalin.

4. Apache Commons IO

Cara umum lainnya untuk menyalin file dengan Java adalah dengan menggunakan pustaka commons-io .

Pertama, kita perlu menambahkan ketergantungan:

 commons-io commons-io 2.6 

Versi terbaru dapat diunduh dari Maven Central.

Kemudian, untuk menyalin file kita hanya perlu menggunakan metode copyFile () yang ditentukan di kelas FileUtils . Metode ini mengambil sumber dan file target.

Mari kita lihat pengujian JUnit menggunakan metode 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 biji

Terakhir, kita akan melihat pustaka Guava Google.

Sekali lagi, jika kita ingin menggunakan Guava , kita perlu menyertakan dependensi:

 com.google.guava guava 23.0 

Versi terbaru dapat ditemukan di Maven Central.

Dan inilah cara Jambu menyalin file:

@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. Kesimpulan

Pada artikel ini, kami mempelajari cara paling umum untuk menyalin file di Java.

Penerapan lengkap artikel ini dapat ditemukan di Github.