[英]Is there a reason to use BufferedReader over InputStreamReader when reading all characters?
[英]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.