一、问题提出

在进行网关引擎开发时,获取到一个http请求的inputstream后,可能要多次利用它进行read操作。由于流读过一次就不能再读了,所以需要实现InputStream的复制。

而InputStream对象本身不能复制,因为它没有实现Cloneable接口。

二、解决方案

1、方案一:使用ByteArrayOutputStream<->InputStream

此时,可以先把InputStream转化成ByteArrayOutputStream,后面要使用InputStream对象时,再从ByteArrayOutputStream转化回来就好了。代码实现如下:

InputStream input = httpconn.getInputStream();

ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int len;
while ((len = input.read(buffer)) > -1 ) {
    baos.write(buffer, 0, len);
}
baos.flush();

InputStream stream1 = new ByteArrayInputStream(baos.toByteArray());  //TODO:显示到前台
InputStream stream2 = new ByteArrayInputStream(baos.toByteArray());   //TODO:本地缓存

HTTP协议扫盲(六)InputStream的复用-LMLPHP

这种适用于一些不是很大的流,因为缓存流是会消耗内存的。

2、方案二:使用流的mark 和 reset方法

参见链接:

inputstream复制:http://www.cnblogs.com/happyaday/p/4616023.html

对象克隆:https://zhidao.baidu.com/question/181598914089683044.html

04-16 13:00