2017-06-10 115 views
3

我想查看從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)我確實收到了所有的內容。

回答

2

參見InputStream#read(byte[] b,int off,int len)合同:

讀取最多len從輸入流數據的字節到的 字節的數組。嘗試讀取多達len字節,,但 較小的數字可能會被讀取。實際讀取的字節數是 返回一個整數

不是使用此方法,使用IOUtils.read讀取,直到你得到你在一個循環中請求的字節數。

+0

aw dang it!任何想法如何讓它回報更多?我只是使用偏移量,並提出另一個要求?你確定這不僅僅是說如果它沒有剩下更多的字節,它會返回更少的字節? –

+0

是的,我很確定。您只需要持續循環讀取,直到收到所需的數據量或到達尾流。 – oleg

+0

好的!帥氣的男人!試試吧! –

相關問題