加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

使用Java I / O在HTTP网络上读取流

发布时间:2020-12-15 04:20:08 所属栏目:Java 来源:网络整理
导读:现在我正在努力提高 java I / O的性能.我有一些疯狂的疑问,使用java I / O在网络上读/写流,如下所述.我脑海里浮现出几种意见.但我想清除所有这些 码 URL url = new URL("http://example.com/connector/url2Service"); URLConnection urlConnection = url.ope
现在我正在努力提高 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:这将提供与远程资源进行通信的对象.但这种联系尚未建立.
>位置2:构建并获取请求.
>位置3:将字节写入ByteArrayOutputStream.
>位置4:这是与服务器进行通信的地方.我们正在编写字节.因此,服务器可以开始读取它们.当执行退出此行时,我们已完成发送请求对象.
>位置5:当我们退出此行时,服务器已完成发送响应对象.因此,我们可以开始阅读响应对象.
>位置6:将对象读取为4096字节块.
>位置7:将读取的字节写入ByteArrayOutputStream.
>位置8:完成读取响应并将其转换为字符串.

我的问题

>我们可以说上传请求的重点是什么
完成? (一世
相信这是在我们执行存在位置时完成的
4)
>重点是什么
我们可以说响应下载完成了吗? (我对第5点和第8点有疑问)
>当我们退出第5点时,这意味着响应是完全的
已下载或刚开始下载?
>到哪个点网络(带宽)会对性能产生影响? (第5,6,7 ……)
>现在我正在调整InputStream读取代码.如果您有任何建议请分享?

参考文献:

> http://www.oracle.com/technetwork/articles/javase/perftuning-137844.html
> http://www.oracle.com/technetwork/java/performance-139413.html
> http://www.javaworld.com/article/2076241/build-ci-sdlc/tweak-your-io-performance-for-faster-runtime.html
> http://www.kegel.com/java/wp-javaio.html

解决方法

>在建立连接时,请求可以缓冲在系统缓冲区中,因此在您通过位置6之前,请求的发送 – “上传” – 不能保证完成.此时,您知道获取请求已经已被服务器接收,因为它现在正在发送响应.传递位置4只意味着您的程序已将请求传递到您自己的系统缓冲区. >已收到响应 – “下载”已完成 – 在最后一次到第6位之后,当它返回-1表示流结束时. >当您退出位置5时,可能已收到或未收到回复.您所做的只是获得对已存在的输入流的显式访问.响应已经完全接收并且已经缓冲在系统TCP缓冲区中,并且可能尚未收到任何响应. >您必须从位置4到位置6的最后一次迭代打开网络资源.在代码中,您将继续无限期地保持连接打开状态.在循环退出位置6/7后,可以通过关闭连接来节省网络资源. >(a)不要打扰rqByteArrayOutputStream.而是将输出流从OutputStreamWriter中的连接包装起来,并将请求字符串直接写入该输出流.这样可以节省几行代码并删除一次复制请求字符串的迭代. >(b)在完成输出流和输入流时调用close(),以允许释放网络资源.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读