我现在正在处理与Java I / O相关的性能改进问题。关于使用Java I / O通过网络读取/写入流,我有一些疑问,如下所述。我的脑海中出现了许多不同的观点,但我想要澄清它们。
代码
URL url = new URL("http://example.com/connector/url2Service");
URLConnection urlConnection = url.openConnection(); // Position 1
HttpURLConnection httpURLConnection = (HttpURLConnection)urlConnection;
String requestStr = buildRequestString();// Position 2
ByteArrayOutputStream rqByteArrayOutputStream = new ByteArrayOutputStream();
rqByteArrayOutputStream.write(((String)requestStr).getBytes()); // Position 3
httpURLConnection.setDoOutput(true);
httpURLConnection.setUseCaches(false);
httpURLConnection.setDoInput(true);
httpURLConnection.setRequestMethod("POST");
rqByteArrayOutputStream.writeTo(httpURLConnection.getOutputStream()); // Position 4
// Waiting for the response.
InputStream inputStream = httpURLConnection.getInputStream(); // Position 5
ByteArrayOutputStream rsByteArrayOutputStream = new ByteArrayOutputStream();
byte[] buffer = new byte[4096];
int length = 0;
while ((length = inputStream.read(buffer)) != -1) { // Position 6
rsByteArrayOutputStream.write(buffer, 0, length);// Position 7
}
String response = new String(rsByteArrayOutputStream.toByteArray());// Position 8
我的理解
- 位置1:这将提供一个对象与远程资源通信。但是连接尚未建立。
- 位置2:构建并获取请求。
- 位置3:将字节写入ByteArrayOutputStream。
- 位置4:这是与服务器通信开始的地方。我们正在编写字节。因此,服务器可以开始读取它们。当执行退出此行时,我们已完成发送请求对象。
- 位置5:当我们退出此行时,服务器已完成发送响应对象。因此,我们可以开始读取响应对象。
- 位置6:以4096字节块的形式读取对象。
- 位置7:将读取的字节写入ByteArrayOutputStream。
- 位置8:完成读取响应并将其转换为字符串。
我的问题
- 我们何时可以说请求上传已完成?(我相信当执行退出位置4时,这已经完成了)
- 我们何时可以说响应下载已完成?(我对位置5和8之间存在疑虑)
- 当我们退出位置5时,这是否意味着响应已完全下载,还是刚刚开始下载?
- 到哪个位置网络(带宽)会影响性能?(位置5、6、7...)
- 现在我正在调整InputStream读取代码。如果您有任何建议,请分享?
参考资料: