1. Gambaran keseluruhan
Dalam tutorial ringkas ini, kita akan menggambarkan cara menulis InputStream ke File - pertama menggunakan Java biasa, kemudian Guava dan akhirnya perpustakaan Apache Commons IO.
Artikel ini adalah bagian dari tutorial " Java - Back to Basic " di Baeldung.
2. Tukar Menggunakan Java Plain
Mari mulakan dengan penyelesaian 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 bahawa dalam contoh ini, aliran input mempunyai data yang diketahui dan telah ditentukan - seperti fail pada cakera atau aliran dalam memori. Oleh kerana itu, kita tidak perlu melakukan pemeriksaan batas dan kita boleh - jika ingatan mengizinkan - hanya membacanya dan menulisnya sekali gus.

Sekiranya aliran input dihubungkan ke aliran data yang sedang berlangsung - misalnya, respons HTTP yang berasal dari sambungan yang sedang berlangsung - maka membaca keseluruhan aliran sekali bukan pilihan. Sekiranya demikian, kita perlu memastikan bahawa kita terus membaca sehingga kita sampai ke hujung 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); }
Akhirnya, inilah cara lain yang mudah untuk 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. Tukarkan Menggunakan Jambu Batu
Seterusnya - mari kita lihat penyelesaian berasaskan Jambu Batu yang lebih mudah:
@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. Tukar Menggunakan Commons IO
Dan akhirnya - penyelesaian 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 di sana anda memilikinya - 3 cara cepat untuk menulis InputStream ke Fail.
Pelaksanaan semua contoh ini boleh didapati di projek GitHub kami.