将Java InputStream写入OutputStream的简单方法

2023/06/09

1. 概述

在这个教程中,我们学习如何将Java InputStream写入Java OutputStream。首先我们使用Java 8和Java 9 的核心功能。然后,我们使用两个外部库:Guava和Apache Commons IO。

Java 9、Guava和Apache Commons IO提供的工具方法不会刷新或关闭流。因此,我们需要使用try-with-resources或finally块来管理这些资源。

2. 使用Java 8

首先,我们创建一个简单的方法,使用Java原生API将内容从InputStream复制到OutputStream:

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

这段代码非常简单,我们只是读取一些字节,然后将它们写出来。

3. 使用Java 9

Java 9为此提供了一个工具方法InputStream.transferTo(),让我们看看如何使用该方法:

@Test
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, targetStream.toString());
	}
}

请注意,在处理文件流时,使用Files.copy()比使用transferTo()方法更有效。

4. 使用Guava

接下来,我们看看如何使用Guava的工具方法ByteStreams.copy()。

首先我们需要在pom.xml中包含guava依赖:

<dependency>
    <groupId>com.google.guava</groupId>
    <artifactId>guava</artifactId>
    <version>31.0.1-jre</version>
</dependency>

我们通过一个简单的测试用例来演示它的用法:

@Test
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, targetStream.toString());
	}
}

5. 使用Commons IO

最后,让我们看看如何使用Commons IO中的IOUtils.copy()方法来完成此任务。

当然,我们需要将commons-io依赖添加到pom.xml中:

<dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>2.11.0</version>
</dependency>

让我们创建一个简单的测试用例,使用IOUtils将数据从输入流复制到输出流:

@Test
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, targetStream.toString());
	}
}

注意:Commons IO提供了使用InputStream和OutputStream的其他方法。当需要复制2GB或更多数据时,应使用IOUtils.copyLarge()。

6. 总结

在本文中,我们介绍了将数据从InputStream复制到OutputStream的简单方法。

与往常一样,本教程的完整源代码可在GitHub上获得。

Show Disqus Comments

Post Directory

扫码关注公众号:Taketoday
发送 290992
即可立即永久解锁本站全部文章