我有一个奇怪的senario
我有尝试将其转换为字符串的HTTP响应,问题是第一次运行,但第二次InputStream数据为空
而且我只在response1中有数据
InputStream is = entity.getContent();
String response1 = IOUtils.toString(is, "utf-8"); // Here every thing is fine
String respons2 = IOUtils.toString(is, "utf-8"); // Here the response2 is empty
and is (InputStream) holding no data
这是什么问题,我需要能够将数据保存在InputStream中,以备将来在代码中使用
答案 0 :(得分:2)
但是,在检查javadoc httpEntity.getContent时,您的需求不是很清楚:
返回实体的内容流。可重复的实体是 期望为每次调用创建一个InputStream的新实例 这种方法,因此可以多次使用。实体 不可重复的预期返回相同的InputStream 实例,因此可能不会被消耗超过一次。
您是否通过调用
来检查httpEntity是否可重复httpEntity.isRepeatable()
如果为true,则可以执行以下操作:
InputStream is = entity.getContent();
String response1 = IOUtils.toString(is, "utf-8");
// retrieve a new instance of inputStream
is = entity.getContent();
String response2 = IOUtils.toString(is, "utf-8");
最后但并非最不重要的一点(因为我不知道您的确切需求),如果实体能够多次产生其数据,则先前的代码将有所帮助,但是您仍应评估以下两者之间的成本:
答案 1 :(得分:0)
不,流不应该被多次读取。
如果要保留流中的内容以供重复使用,则可以这样做。就您而言,只需重新使用 response1 字符串。
答案 2 :(得分:0)
在阅读之前,您应该检查流是否支持重置。您可以检查InputStream#markSupported()
的结果,该结果告诉您是否可以使用方法对mark()/reset()
。
如果支持标记,那么您可以在阅读时进行mark()
,然后reset()
返回开始。
答案 3 :(得分:0)
如果httpEntity是不可重复的,则可以将InputStream包装在BufferedInputStream中;这样,您可以将其重置以允许重新读取。本质上,BufferedInputStream第一次将数据读取到内部缓冲区中,然后在您重新读取时重新使用该缓冲区。
final int bufferSize = 1_000_000; // about 1 MB; must be large enough to hold all the http content
InputStream is = new BufferedInputStream(entity.getContent(), bufferSize);
is.mark(bufferSize);
String response1 = IOUtils.toString(is, "utf-8");
is.reset();
String respons2 = IOUtils.toString(is, "utf-8");