api-gateway实践(19)InputStream的复用

Posted 非淡泊无以明志,非宁静无以致远 - 长安快马

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了api-gateway实践(19)InputStream的复用相关的知识,希望对你有一定的参考价值。

一、问题提出

在进行网关引擎开发时,获取到一个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:本地缓存

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

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

参见链接:

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

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

以上是关于api-gateway实践(19)InputStream的复用的主要内容,如果未能解决你的问题,请参考以下文章

api-gateway实践(15)guava-19.0和google-collections-1.0 的 ImmutableSet 类冲突

api-gateway实践Linux环境启动

api-gateway实践(13)新服务网关 - SpringCloud Zuul

api-gateway实践(12)新服务网关 - path变量

api-gateway实践网关服务集成验证

api-gateway实践(18)新迭代工作列表