【问题标题】:Does URLConnection's getInputStream() return the same InputStream every time?URLConnection 的 getInputStream() 是否每次都返回相同的 InputStream?
【发布时间】:2016-10-12 23:08:40
【问题描述】:

像这样从 URLConnection 获取 InputStream 是很常见的:

InputStream stream =  connection.getInputStream();

连接是URLConnection

https://developer.android.com/reference/java/net/URLConnection.html#getInputStream()

我有一种情况,我想重用一个流。我可以访问连接对象,现在我的问题是 URLConnection 的单个实例是否每次都返回“相同”的 InputStream?也就是说,如果我再次调用 connection.getInputStream() (但对于同一个连接对象),我会得到一个新流吗?

【问题讨论】:

    标签: java android inputstream urlconnection


    【解决方案1】:

    没关系。不管有没有,都没有区别。考虑一个总是返回new DataInputStream(socket.getInputStream()) 的方法。 (我并没有声称它这样实现的:我们只是在考虑。)除了将它与== 进行比较之外,您无法对流进行任何实际操作,这会告诉您它是否是每次这样的新流或总是相同的流。您从中读出的内容不受影响。

    【讨论】:

      【解决方案2】:

      URLConnection 是一个接口,如果getInputStream 返回一个新流,这完全取决于实现者。

      验证这一点的最佳方法是......

      URLConnection con = new URL(MY_URL_STRING).openConnection() ;
      InputStream in1 = con.getInputStream(); 
      InputStream in2 = con.getInputStream();
      boolean streamEquals = in1.equals(in2);
      

      【讨论】:

        【解决方案3】:

        一般来说,这类问题(“X 做 Y 吗?”)的答案是:文档 X 做 Y 吗?如果是这样,是的(或者它坏了);如果不是,您无法保证,并且必须假设不会。

        那么让我们看看URLConnection#getInputStream's documentation

        返回一个从这个打开的连接中读取的输入流。如果在数据可供读取之前读取超时过期,则从返回的输入流读取时可能会引发 SocketTimeoutException。

        返回:

        从此打开的连接中读取的输入流。

        所以你不能依赖这样做,因为它不承诺。 (我还在 JavaDoc 的其他地方查找了URLConnection。)

        (不过,我在 Android 之外的测试表明 HttpURLConnection 至少有时会这样做。)

        【讨论】:

          猜你喜欢
          • 2014-08-19
          • 2014-06-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-11-09
          • 2020-01-28
          • 1970-01-01
          相关资源
          最近更新 更多