跳到主要内容

InputStream的复制

描述

在Java9之后,可以通过更加简单的方式对一个InputStream进行复制,使用到的是InputStream中的transferTo方法。

这个方法在JDK中的描述如下

从此输入流中读取所有字节,并按照读取顺序将字节写入给定的输出流。 返回时,此输入流将位于流的末尾。 此方法不会关闭任何一个流。 此方法可能会无限期地阻止从输入流读取或写入输出流。 输入和/或输出流异步关闭或线程在传输期间中断的情况下的行为是高度特定于输入和输出流的,因此未指定。 如果从输入流读取或写入输出流时发生 I/O 错误,那么它可能会在读取或写入一些字节后发生。 因此,输入流可能不在流的末尾,并且一个或两个流可能处于不一致状态。 如果发生 I/O 错误,强烈建议立即关闭两个流。

Params: out – 输出流,非空 Returns: 传输的字节数

从以上的描述中我们可以看到最重要的一句话:此方法不会关闭任何一个流。 这就是我们选择它实现InputStream的复制最好的理由,因为我们对InputStream的读取对这个流被进行关闭,不能重复利用。

代码部分

以下为InputStream的复制代码:

ByteArrayOutputStream outputStream = new ByteArrayOutputStream( );

InputStream inputStream = resourceLoader.getResource("classpath:test.txt").getInputStream();
inputStream.transferTo(outputStream);

InputStream firstClone = new ByteArrayInputStream(baos.toByteArray());
InputStream secondClone = new ByteArrayInputStream(baos.toByteArray());

先创建一个outputStream,然后从指定路径获取我们需要的InputStream,之后我们调用这个InputStream的transferTo,把子节写入创建出来的那个outputStream,此时我们就可以拿着这个outputStream去new 新的InputStream,而不会导致原有的那个inputStream被关闭。