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

时间:2020-03-05 18:47:27  来源:igfitidea点击:

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

那么,给定一个InputStream的in输入和OutputStream的out输出,是否有一种更简单的方法来编写以下内容?

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

解决方案

回答

我认为这会奏效,但请确保对其进行测试...稍有"改进",但在可读性方面可能会有所付出。

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

回答

PipedInputStream和PipedOutputStream可能有用,因为我们可以将它们彼此连接。

回答

使用JDK方法无法轻松完成此操作,但是正如Apocalisp已经指出的那样,我们并不是唯一拥有此想法的人:我们可以使用Jakarta Commons IO的IOUtils,它还具有许多其他有用的功能, IMO实际上应该成为JDK的一部分...

回答

正如WMR所提到的,来自Apache的org.apache.commons.io.IOUtils具有一种名为copy(InputStream,OutputStream)的方法,该方法完全可以满足需求。

所以你有了:

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

...在代码中。

我们避免使用" IOUtils"是有原因的吗?

回答

如Javadoc所述,只有在具有多个线程时,才应使用" PipedInputStream"和" PipedOutputStream"。

另外,请注意,输入流和输出流不会使用IOException`s包装任何线程中断。因此,我们应该考虑将中断策略合并到代码中:

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

如果我们希望使用此API复制大量数据或者流中无法忍受长时间卡住的数据,这将是一个有用的补充。