Лесни начини за писане на Java InputStream в OutputStream

1. Общ преглед

В този бърз урок ще научим как да напишем Java InputStream в Java OutputStream . Първо ще използваме основната функционалност от Java 8 и Java 9. След това ще разгледаме няколко външни библиотеки - Guava и Apache Commons IO библиотека.

Помощните методи, предоставени от Java 9, Guava и Apache Commons IO, не изплакват или затварят потоците. Така че, ще трябва да управляваме тези ресурси, като използваме try-with-resources или накрая блок.

2. Използване на Java 8

Първо, ще започнем, като създадем прост метод, използващ Java ванилия, за да копираме съдържанието от InputStream в 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); } }

Този код е доста ясен - ние просто четем в някои байтове и след това ги изписваме.

3. Използване на Java 9

Java 9 предоставя метод за помощна програма InputStream.transferTo () за тази задача .

Нека да разгледаме как бихме използвали метода 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())); } }

Имайте предвид, че когато работите с файлови потоци, е по-ефективно да използвате Files.copy (), отколкото метода transferTo () .

4. Използване на Гуава

След това нека разгледаме как бихме използвали полезния метод на Guava ByteStreams.copy () .

Ще трябва да включим зависимостта на гуава в нашия pom.xml :

 com.google.guava guava 29.0-jre 

Нека създадем прост тестов случай, за да покажем как бихме могли да използваме ByteStreams за копиране на данни:

@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. Използване на Commons IO

И накрая, нека разгледаме как бихме използвали метода на Commons IO IOUtils.copy () за тази задача.

Разбира се, ще трябва да добавим зависимостта commons-io към pom.xml :

 commons-io commons-io 2.7 

Нека създадем прост тестов случай, използващ IOUtils за копиране на данни от входния поток в изходния поток:

@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())); } }

Забележка: Commons IO предоставя допълнителни методи за работа с InputStream s и OutputStream s. IOUtils.copyLarge () трябва да се използва винаги, когато е необходимо да се копират 2 GB или повече данни.

6. Заключение

В тази статия разгледахме прости начини за копиране на данни от InputStream в OutputStream .

Изпълнението на тези примери е достъпно в GitHub.