我想查看從HttpClient輸入流內容,高達64k字節。是否可以查看HttpClient的org.apache.http.conn.EofSensorInputStream?
流來自一個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)
我確實收到了所有的內容。
aw dang it!任何想法如何讓它回報更多?我只是使用偏移量,並提出另一個要求?你確定這不僅僅是說如果它沒有剩下更多的字節,它會返回更少的字節? –
是的,我很確定。您只需要持續循環讀取,直到收到所需的數據量或到達尾流。 – oleg
好的!帥氣的男人!試試吧! –