使用Java I / O在HTTP网络上读取流
现在我正在努力提高
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,length);// Position 7 } String response = new String(rsByteArrayOutputStream.toByteArray());// Position 8 我的理解 >位置1:这将提供与远程资源进行通信的对象.但这种联系尚未建立. 我的问题 >我们可以说上传请求的重点是什么 参考文献: > http://www.oracle.com/technetwork/articles/javase/perftuning-137844.html 解决方法
>在建立连接时,请求可以缓冲在系统缓冲区中,因此在您通过位置6之前,请求的发送 – “上传” – 不能保证完成.此时,您知道获取请求已经已被服务器接收,因为它现在正在发送响应.传递位置4只意味着您的程序已将请求传递到您自己的系统缓冲区. >已收到响应 – “下载”已完成 – 在最后一次到第6位之后,当它返回-1表示流结束时. >当您退出位置5时,可能已收到或未收到回复.您所做的只是获得对已存在的输入流的显式访问.响应已经完全接收并且已经缓冲在系统TCP缓冲区中,并且可能尚未收到任何响应. >您必须从位置4到位置6的最后一次迭代打开网络资源.在代码中,您将继续无限期地保持连接打开状态.在循环退出位置6/7后,可以通过关闭连接来节省网络资源. >(a)不要打扰rqByteArrayOutputStream.而是将输出流从OutputStreamWriter中的连接包装起来,并将请求字符串直接写入该输出流.这样可以节省几行代码并删除一次复制请求字符串的迭代. >(b)在完成输出流和输入流时调用close(),以允许释放网络资源.
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |