将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复制大量数据或者流中无法忍受长时间卡住的数据,这将是一个有用的补充。