一尘不染

将Java InputStream的内容写入OutputStream的简单方法

java

今天,我很惊讶地发现我找不到InputStream使用OutputStreamJava 将an 的内容写入an的任何简单方法。显然,字节缓冲区代码并不难编写,但是我怀疑我只是缺少了一些可以使我的生活更轻松的东西(并且代码更清晰)。

那么,给定an InputStream inan OutputStream out,是否有更简单的方法编写以下内容?

byte[] buffer = new byte[1024];
int len = in.read(buffer);
while (len != -1) {
    out.write(buffer, 0, len);
    len = in.read(buffer);
}

阅读 1768

收藏
2020-02-27

共3个答案

一尘不染

Java 9

从Java 9开始,InputStream提供了一种transferTo带有以下签名的方法:

public long transferTo(OutputStream out) throws IOException

如文档所述,transferTo将:

从此输入流中读取所有字节,然后按读取顺序将字节写入给定的输出流。返回时,此输入流将在流的末尾。此方法不会关闭任何一个流。

此方法可能会无限期阻止从输入流读取或写入输出流。输入和/或输出流异步关闭或线程在传输期间中断的情况下的行为是特定于输入和输出流的,因此未指定

因此,为了编写Java内容的InputStream一个OutputStream,你可以这样写:

input.transferTo(output);
2020-02-27
一尘不染

如果你使用的是Java 7,则文件(在标准库中)是最佳方法:

/* You can get Path from file also: file.toPath() */
Files.copy(InputStream in, Path target)
Files.copy(Path source, OutputStream out)

编辑:当然,当你从文件创建InputStreamOutputStream之一时,它只是有用的。用于file.toPath()从文件获取路径。

要写入现有文件(例如使用创建的文件File.createTempFile()),你需要传递REPLACE_EXISTINGcopy选项(否则FileAlreadyExistsException抛出):

Files.copy(in, target, StandardCopyOption.REPLACE_EXISTING)
2020-02-27
一尘不染

如WMR所述,org.apache.commons.io.IOUtilsApache提供了一种名为的方法copy(InputStream,OutputStream),该方法可以完全满足你的需求。

所以你有了:

InputStream in;
OutputStream out;
IOUtils.copy(in,out);
in.close();
out.close();

…在你的代码中。

你有避免的理由IOUtils吗?

2020-02-27