簡體   English   中英

使用InputStreamReader和BufferedReader讀取HTTP響應的速度很慢?

[英]Slow reading of HTTP response using InputStreamReader and BufferedReader?

我在Java中有以下代碼,該代碼將HTTP請求發送到Web服務器並讀取響應:

StringBuilder response = new StringBuilder(50000);
URL url2 = new URL(ServiceURL); 
connection = (HttpURLConnection)url2.openConnection();
connection.setRequestMethod("POST");

//... (some more connection settings) ...

BufferedWriter  wr = new BufferedWriter(new OutputStreamWriter(connection.getOutputStream(), "UTF-8"));

wr.write(Request);
wr.flush ();
wr.close ();

InputStream is = connection.getInputStream();       
BufferedReader rd = new BufferedReader(new InputStreamReader(is));

int i = 0;
while ((i = rd.read()) > 0) {
    response.append((char)i);
}

它適用於大多數情況,但是我遇到一個服務器返回一個相當大的XML(大約500KB;我想這對於一堆文本來說是相當大的..)的問題,在此我不斷收到讀取超時異常。

我認為這不是網絡問題,因為我嘗試使用curl發出相同的請求,並且響應很快就可以正確地到達,大約需要兩秒鍾。

當我查看網絡中發生的事情(使用Wireshark捕獲數據包)時,我注意到計算機中的TCP接收窗口有時已滿。 TCP堆棧有時可以幸免於此。 我可以看到服務器發送TCP保持活動狀態以保持連接狀態,但最終TCP連接斷開了。

可能是代碼的讀取部分(逐個字符附加接收到的響應)使我的代碼變慢了嗎? 有沒有更有效的方式來讀取HTTP響應?

是的,逐個字符閱讀非常慢。 嘗試一次將大塊讀取到緩沖區中:

char[] buf = new char[2048];
int charsRead;
while((charsRead = rd.read(buf, 0, 2048)) > 0) {
    response.append(buf, 0, charsRead);
}

正如Phil所說,逐字節讀取流有點慢。 我更喜歡使用BufferedReader的readLine()方法:

StringBuilder response = new StringBuilder();
String line = "";
while((line = rd.readLine()) != null) {
    response.append(line + System.getProperty("line.separator");
}

如果可能的話,我會考慮使用Apache HTTP Client庫。 它易於使用,並且在處理HTTP內容方面非常強大。 http://hc.apache.org/httpcomponents-client-ga/

您還應該記住設置套接字和連接超時。 這樣,您可以控制連接保持打開狀態的時間(至少在您這邊)。

最后但並非最不重要的一點是,在收到響應后,始終在finally塊中關閉HTTP連接,否則可能會遇到太多打開文件的問題。

希望這會麻木;)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM