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.