Cara Mudah untuk Menulis Java InputStream ke OutputStream

1. Gambaran keseluruhan

Dalam tutorial cepat ini, kita akan belajar bagaimana menulis Java InputStream ke Java OutputStream . Kami pertama kali menggunakan fungsi teras dari Java 8 dan Java 9. Kemudian, kita akan melihat beberapa perpustakaan luaran - Jambu dan perpustakaan Apache Commons IO.

Kaedah utiliti yang disediakan oleh Java 9, Jambu, dan Apache Commons IO tidak mengalir atau menutup aliran. Oleh itu, kita perlu mengurus sumber ini dengan menggunakan sumber daya percubaan atau blok akhirnya .

2. Menggunakan Java 8

Pertama, kita akan mulakan dengan membuat kaedah mudah menggunakan vanilla Java untuk menyalin kandungan dari InputStream ke OutputStream :

void copy(InputStream source, OutputStream target) throws IOException { byte[] buf = new byte[8192]; int length; while ((length = source.read(buf)) > 0) { target.write(buf, 0, length); } }

Kod ini cukup mudah - kita hanya membaca beberapa bait dan kemudian menulisnya.

3. Menggunakan Java 9

Java 9 menyediakan kaedah utiliti, InputStream.transferTo () , untuk tugas ini .

Mari lihat bagaimana kita menggunakan kaedah transferTo () :

@Test public void givenUsingJavaNine_whenCopyingInputStreamToOutputStream_thenCorrect() throws IOException { String initialString = "Hello World!"; try (InputStream inputStream = new ByteArrayInputStream(initialString.getBytes()); ByteArrayOutputStream targetStream = new ByteArrayOutputStream()) { inputStream.transferTo(targetStream); assertEquals(initialString, new String(targetStream.toByteArray())); } }

Perhatikan bahawa ketika bekerja dengan aliran fail, lebih efisien menggunakan Files.copy () daripada kaedah transferTo () .

4. Menggunakan Jambu Batu

Seterusnya, mari kita lihat bagaimana kita menggunakan kaedah utiliti Jambu Batu ByteStreams.copy () .

Kita perlu memasukkan kebergantungan jambu biji dalam pom.xml kami :

 com.google.guava guava 29.0-jre 

Mari buat kes ujian mudah untuk menunjukkan bagaimana kita dapat menggunakan ByteStreams untuk menyalin data:

@Test public void givenUsingGuava_whenCopyingInputStreamToOutputStream_thenCorrect() throws IOException { String initialString = "Hello World!"; try (InputStream inputStream = new ByteArrayInputStream(initialString.getBytes()); ByteArrayOutputStream targetStream = new ByteArrayOutputStream()) { ByteStreams.copy(inputStream, targetStream); assertEquals(initialString, new String(targetStream.toByteArray())); } }

5. Menggunakan Commons IO

Akhirnya, mari kita lihat bagaimana kita akan menggunakan kaedah Commons IO IOUtils.copy () untuk tugas ini.

Sudah tentu, kita perlu menambahkan pergantungan commons-io ke pom.xml :

 commons-io commons-io 2.7 

Mari buat kes ujian mudah menggunakan IOUtils untuk menyalin data dari aliran input ke aliran output:

@Test public void givenUsingCommonsIO_whenCopyingInputStreamToOutputStream_thenCorrect() throws IOException { String initialString = "Hello World!"; try (InputStream inputStream = new ByteArrayInputStream(initialString.getBytes()); ByteArrayOutputStream targetStream = new ByteArrayOutputStream()) { IOUtils.copy(inputStream, targetStream); assertEquals(initialString, new String(targetStream.toByteArray())); } }

Catatan: Commons IO menyediakan kaedah tambahan untuk bekerja dengan InputStream s dan OutputStream s. IOUtils.copyLarge () harus digunakan bila perlu untuk menyalin data 2 GB atau lebih.

6. Kesimpulannya

Dalam artikel ini, kami meneroka cara mudah untuk menyalin data dari InputStream ke OutputStream .

Pelaksanaan contoh-contoh ini boleh didapati di GitHub.