今天,我很惊讶地发现我找不到InputStream使用OutputStreamJava 将an 的内容写入an的任何简单方法。显然,字节缓冲区代码并不难编写,但是我怀疑我只是缺少了一些可以使我的生活更轻松的东西(并且代码更清晰)。
InputStream
OutputStreamJava
那么,给定an InputStream in和an OutputStream out,是否有更简单的方法编写以下内容?
an InputStream in
an OutputStream out
byte[] buffer = new byte[1024]; int len = in.read(buffer); while (len != -1) { out.write(buffer, 0, len); len = in.read(buffer); }
Java 9
从Java 9开始,InputStream提供了一种transferTo带有以下签名的方法:
transferTo
public long transferTo(OutputStream out) throws IOException
如文档所述,transferTo将:
从此输入流中读取所有字节,然后按读取顺序将字节写入给定的输出流。返回时,此输入流将在流的末尾。此方法不会关闭任何一个流。
此方法可能会无限期阻止从输入流读取或写入输出流。输入和/或输出流异步关闭或线程在传输期间中断的情况下的行为是特定于输入和输出流的,因此未指定
因此,为了编写Java内容的InputStream一个OutputStream,你可以这样写:
OutputStream
input.transferTo(output);
如果你使用的是Java 7,则文件(在标准库中)是最佳方法:
/* You can get Path from file also: file.toPath() */ Files.copy(InputStream in, Path target) Files.copy(Path source, OutputStream out)
编辑:当然,当你从文件创建InputStream或OutputStream之一时,它只是有用的。用于file.toPath()从文件获取路径。
file.toPath()
要写入现有文件(例如使用创建的文件File.createTempFile()),你需要传递REPLACE_EXISTINGcopy选项(否则FileAlreadyExistsException抛出):
File.createTempFile()
REPLACE_EXISTINGcopy
FileAlreadyExistsException
Files.copy(in, target, StandardCopyOption.REPLACE_EXISTING)
如WMR所述,org.apache.commons.io.IOUtilsApache提供了一种名为的方法copy(InputStream,OutputStream),该方法可以完全满足你的需求。
org.apache.commons.io.IOUtilsApache
copy(InputStream,OutputStream)
所以你有了:
InputStream in; OutputStream out; IOUtils.copy(in,out); in.close(); out.close();
…在你的代码中。
你有避免的理由IOUtils吗?
IOUtils