我试图查看来自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)
我会得到所有的内容。
答案 0 :(得分:2)
请参阅InputStream#read(byte[] b,int off,int len)合同:
将输入流中最多len个字节的数据读入数组 字节。尝试读取len个字节,但是a 可以阅读较小的数字。实际读取的字节数是 以整数形式返回
使用f64
代替使用此方法,直到获得循环中请求的字节数为止。