使用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, 0, length);// Position 7
}

String response  = new String(rsByteArrayOutputStream.toByteArray());// Position 8

我的理解

  • 位置1:这将提供一个对象与远程资源进行通信。但是尚未建立连接。
  • 职位2:建立并获取请求。
  • 位置3:将字节写入ByteArrayOutputStream。
  • 位置4:这是与服务器开始通信的地方。我们正在写字节。因此,服务器可以开始读取它们。当执行退出此行时,我们已完成发送请求对象。
  • 位置5:退出此行时,服务器已完成发送响应对象。因此,我们可以开始读取响应对象。
  • 位置6:以4096字节块的形式读取对象。
  • 位置7:将读取的字节写入ByteArrayOutputStream。
  • 位置8:完成读取响应并将其转换为String。

我的问题

  1. 我们可以说请求上传完成了吗?(我相信当我们的执行存在于职位4时,就完成了)
  2. 我们可以说响应下载完成了什么意思?(我怀疑第5点和第8点之间)
  3. 当我们退出Point 5时,是否意味着响应已完全下载或刚刚开始下载?
  4. 网络(带宽)将在多大程度上影响性能?(第5、6、7点...)
  5. 现在,我正在调整InputStream的阅读代码。如果您有任何建议,请分享?

参考文献:

沃伦·露
  1. 建立连接时,请求可能会缓存在系统缓冲区中,因此直到通过位置6时,才能保证请求的“上传”发送完成。在这一点上,您知道get请求已经完成。由于服务器现在正在发送响应,因此已收到该消息。传递位置4仅表示您的程序已将请求传递到您自己的系统缓冲区中。

  2. 在位置6的最后一次返回流结束时,已收到响应-“下载”完成。

  3. 当您退出位置5时,可能会或可能不会收到响应。您要做的就是获得对已存在的输入流的显式访问。可能已经完全接收到响应并将其缓冲在系统TCP缓冲区中,并且有可能还没有收到响应。

  4. 您将必须从位置4到位置6的最后一次迭代打开网络资源。在您的代码中,您将继续无限期地保持连接打开状态。退出位置6/7while循环后,可以通过关闭连接来节省网络资源

  5. (a)不用理会rqByteArrayOutputStream。而是将连接的输出流包装在OutputStreamWriter中,然后将请求字符串直接写入该流。这样可以节省几行代码,并消除了复制请求字符串的一次迭代。

  6. (b)完成输出流和输入流后,对它们调用close(),以释放网络资源。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用Java通过HTTP流数据

来自分类Dev

I /在读取输入消息O错误; 嵌套的例外是产生java.io.IOException:流关闭

来自分类Dev

Java中的管道式I / O流

来自分类Dev

Java中的可中断网络I / O

来自分类Dev

使用I / O流的分段错误

来自分类Dev

使用绑定以红色执行网络I / O

来自分类Dev

使用绑定以红色执行网络I / O

来自分类Dev

在ksh中使用-i选项(从文件读取sql)运行sqlcmd之后,文件描述符和/或I / O流的异常行为会导致无限循环

来自分类Dev

无法正确读取文件-数据I / O流

来自分类Dev

Java套接字I / O流空指针异常

来自分类Dev

如何在 Java 中关闭嵌套的 I/O 流

来自分类Dev

如何使用JAVA的非多核阻塞I / O(NIO)API?

来自分类Dev

在Java中将异常与用户I / O结合使用

来自分类Dev

Java:使用流读取文件的问题

来自分类Dev

使用 Renci.SshNet 通过 ssh 连接读取输出流

来自分类Dev

通过网络使用ADS(备用数据流)复制文件会丢失隐藏流吗?

来自分类Dev

通过网络的高效二进制I / O

来自分类Dev

如何使用Ruby读取恒定的NMEA http数据流

来自分类Dev

集团通过使用Java流集合属性

来自分类Dev

使用文件I / O读取字节长度

来自分类Dev

使用openCV VC ++进行文件I / O读取

来自分类Dev

使用I / O方法打开/读取未知文件列表

来自分类Dev

DBMS 如何使用文件 I/O 读取数据库?

来自分类Dev

Java 8使用流java.io.UncheckedIOException读取文件

来自分类Dev

使用Java的OpenCV中的网络摄像头流

来自分类Dev

使用Java的OpenCV中的网络摄像头流

来自分类Dev

使用流读取私钥

来自分类Dev

Java I / O文件程序

来自分类Dev

使用Clojure / Java从s3读取流

Related 相关文章

热门标签

归档