是否可以窥视HttpClient的org.apache.http.conn.EofSensorInputStream?

时间:2017-06-10 14:01:56

标签: java httpclient inputstream

我试图查看来自HttpClient的输入流内容,最多64k字节。

该流来自HttpGet,没有什么不寻常之处:

HttpGet requestGet = new HttpGet(encodedUrl); HttpResponse httpResponse = httpClient.execute(requestGet); int status = httpResponse.getStatusLine().getStatusCode(); if (status == HttpStatus.SC_OK) { return httpResponse.getEntity().getContent(); }

它返回的输入流的类型为org.apache.http.conn.EofSensorInputStream

我们的用例是这样的,我们需要“窥视”输入流的第一个(最多64k)字节。我使用此处描述的算法How do I peek at the first two bytes in an InputStream?

PushbackInputStream pis = new PushbackInputStream(inputStream, DEFAULT_PEEK_BUFFER_SIZE); byte [] peekBytes = new byte[DEFAULT_PEEK_BUFFER_SIZE]; int read = pis.read(peekBytes); if (read < DEFAULT_PEEK_BUFFER_SIZE) { byte[] trimmed = new byte[read]; System.arraycopy(peekBytes, 0, trimmed, 0, read); peekBytes = trimmed; } pis.unread(peekBytes);

当我使用ByteArrayInputStream时,这没有问题。

问题:使用org.apache.http.conn.EofSensorInputStream时,我只在流的开头获得少量字节。通常大约400字节。当我预计高达64k字节。

我还尝试使用BufferedInputStream读取前64k字节,然后调用.reset(),但这也不起作用。同样的问题。

为什么会这样?我不认为有什么东西在关闭流,因为如果你打电话给IOUtils.toString(inputStream)我会得到所有的内容。

1 个答案:

答案 0 :(得分:2)

请参阅InputStream#read(byte[] b,int off,int len)合同:

  

将输入流中最多len个字节的数据读入数组   字节。尝试读取len个字节,但是a   可以阅读较小的数字。实际读取的字节数是   以整数形式返回

使用f64代替使用此方法,直到获得循环中请求的字节数为止。