Java - Menulis InputStream ke File

1. Ikhtisar

Dalam tutorial singkat ini, kami akan mengilustrasikan cara menulis InputStream ke File - pertama menggunakan Java biasa, lalu Guava, dan terakhir library Apache Commons IO.

Artikel ini adalah bagian dari tutorial " Java - Kembali ke Dasar " di Baeldung.

2. Konversi Menggunakan Java Biasa

Mari kita mulai dengan solusi Java :

@Test public void whenConvertingToFile_thenCorrect() throws IOException { InputStream initialStream = new FileInputStream( new File("src/main/resources/sample.txt")); byte[] buffer = new byte[initialStream.available()]; initialStream.read(buffer); File targetFile = new File("src/main/resources/targetFile.tmp"); OutputStream outStream = new FileOutputStream(targetFile); outStream.write(buffer); }

Perhatikan bahwa dalam contoh ini, aliran input memiliki data yang diketahui dan telah ditentukan sebelumnya - seperti file pada disk atau aliran dalam memori. Karena itu, kami tidak perlu melakukan pemeriksaan batas dan kami dapat - jika memori memungkinkan - cukup membacanya dan menulisnya dalam sekali jalan.

Jika aliran masukan ditautkan ke aliran data yang sedang berlangsung - misalnya, respons HTTP yang berasal dari koneksi yang sedang berlangsung - maka membaca seluruh aliran sekali bukanlah suatu pilihan. Dalam hal ini, kita perlu memastikan bahwa kita terus membaca sampai kita mencapai ujung aliran :

@Test public void whenConvertingInProgressToFile_thenCorrect() throws IOException { InputStream initialStream = new FileInputStream( new File("src/main/resources/sample.txt")); File targetFile = new File("src/main/resources/targetFile.tmp"); OutputStream outStream = new FileOutputStream(targetFile); byte[] buffer = new byte[8 * 1024]; int bytesRead; while ((bytesRead = initialStream.read(buffer)) != -1) { outStream.write(buffer, 0, bytesRead); } IOUtils.closeQuietly(initialStream); IOUtils.closeQuietly(outStream); }

Terakhir, inilah cara sederhana lainnya kita dapat menggunakan Java 8 untuk melakukan operasi yang sama:

@Test public void whenConvertingAnInProgressInputStreamToFile_thenCorrect2() throws IOException { InputStream initialStream = new FileInputStream( new File("src/main/resources/sample.txt")); File targetFile = new File("src/main/resources/targetFile.tmp"); java.nio.file.Files.copy( initialStream, targetFile.toPath(), StandardCopyOption.REPLACE_EXISTING); IOUtils.closeQuietly(initialStream); }

3. Konversi Menggunakan Jambu Biji

Selanjutnya - mari kita lihat solusi berbasis Jambu Biji yang lebih sederhana:

@Test public void whenConvertingInputStreamToFile_thenCorrect3() throws IOException { InputStream initialStream = new FileInputStream( new File("src/main/resources/sample.txt")); byte[] buffer = new byte[initialStream.available()]; initialStream.read(buffer); File targetFile = new File("src/main/resources/targetFile.tmp"); Files.write(buffer, targetFile); }

4. Konversi Menggunakan Commons IO

Dan akhirnya - solusi yang lebih cepat dengan Apache Commons IO:

@Test public void whenConvertingInputStreamToFile_thenCorrect4() throws IOException { InputStream initialStream = FileUtils.openInputStream (new File("src/main/resources/sample.txt")); File targetFile = new File("src/main/resources/targetFile.tmp"); FileUtils.copyInputStreamToFile(initialStream, targetFile); }

Dan begitulah - 3 cara cepat menulis InputStream ke File.

Penerapan semua contoh ini dapat ditemukan di proyek GitHub kami.