Java - Tulis InputStream ke Fail

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.