2011-05-07 78 views
2

我一直在Java中使用各種HTTP客戶從網站上獲取各種信息或使用Web服務(如谷歌地圖地理編碼器)爲什麼需要HTTP客戶端中的InputStream? (JAVA)

當前客戶端我的工作是從HTTP Components client Apache的。

我總是想知道爲什麼沒有.getText()或.getBytes()方法,它只是給我所有的url內容,而是有返回InputStream的方法。這是什麼意思?

這不像我不斷與服務器通信,以便我不得不繼續檢查流。 HTTP是無狀態的,那麼爲什麼沒有getText()/ getBytes()方法在接收到HTTP響應(如String或byte [])後簡單地返回內容?

回答

6

因爲服務器開始在流中輸出結果,並且客戶端得到它。您可以將該流緩存到內存中並將其轉換爲String/byte[],但您也可以處理其中的部分內容,並丟棄它們。

+1

是的,但是當我得到我的響應對象時,數據已收到並且連接已關閉 - 對嗎? – Dexter 2011-05-08 14:24:59

+1

不是。 HttpClient從基礎連接流中傳輸數據至少保持打開狀態直到響應實體主體被完全消耗爲止 – oleg 2011-05-08 19:37:11

2

因爲它是一個網絡;因爲它是一個流;因爲服務器響應可以任意大。同樣的推理適用於文件。

1

除了已經提到的,對於以下場景,輸入流是強制性的:HTTP服務器向使用-Xmx512M的JVM中運行的客戶端提供1 GB響應。 getBytes()getString()只能導致OutOfMemoryError,而讀取輸入流(每次1K)非常合理。

+0

因此,在我從輸入流中讀取數據之前,數據沒有被讀入JVM的內存中?我總是認爲客戶端確實是HTTP的東西,然後關閉連接,而不管我如何處理響應。 – Dexter 2011-05-08 14:23:08

+0

這完全取決於客戶端,但在上述情況下,將整個響應讀入內存的客戶端只會崩潰。據我所知,在HttpClient(實際上是HttpMethodBase)中,它取決於響應是以byte數組的形式讀入內存,還是返回輸入流以供客戶端通過網絡讀取數據。 – 2011-05-09 16:34:12

相關問題