java - 使用 InputStreamReader 和 BufferedReader 缓慢读取 HTTP 响应?

标签 java http httpurlconnection stringbuilder inputstreamreader

我有以下 Java 代码,它向 Web 服务器发送 HTTP 请求并读取响应:

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 keep-alive 以保持连接,但最终 TCP 连接中断。

会不会是代码的读取部分(逐个字符地附加接收到的响应)拖慢了我的代码速度?有没有更有效的方法来读取 HTTP 响应?

最佳答案

是的,一个字符一个字符地阅读是很慢的。尝试一次将 block 读入缓冲区:

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

关于java - 使用 InputStreamReader 和 BufferedReader 缓慢读取 HTTP 响应?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13534452/

相关文章:

java - 如何使用 Java 获取计算机特定的 ID 号

java - Tomcat 6.0 和 Eclipse。服务器的多个实例表现不同

java - 在 Java 中与多个打开的应用程序共享文件存储索引

javascript - HTTP 请求的 .then 子句中出现 CORS 错误

java - 在java中观察/捕获302重定向

java - Android HttpURLConnection写入post数据

java - 将图表[]从一个变量复制到另一个变量,然后更改单个字符

java - Kotlin 中的通用转换

html - C:HTTP 网络服务器 - 图像“http://localhost...无法显示,因为它包含错误”

httpurlconnection - HttpUrlConnection中的错误流