URLConnection的getInputStream()每次都返回相同的InputStream吗?

时间:2016-06-12 12:41:55

标签: java android inputstream urlconnection

从URLConnection获取一个InputStream非常常见:

InputStream stream =  connection.getInputStream();

其中连接是URLConnection

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

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

3 个答案:

答案 0 :(得分:1)

一般来说,这类问题的答案(" X做Y?")是:文档 X是否做Y?如果是的话,是的(或者它被打破了);如果没有,你没有保证,所以必须不承担。

让我们看一下URLConnection#getInputStream's documentation

  

返回从此打开的连接读取的输入流。如果读取超时在数据可用于读取之前到期,则从返回的输入流读取时可能抛出SocketTimeoutException。

     

<强>返回:

     

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

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

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

答案 1 :(得分:0)

URLConnection是一个接口,如果getInputStream返回新的流,它都取决于实现者。

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

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

答案 2 :(得分:0)

没关系。它是否成功也没有任何区别。考虑始终返回new DataInputStream(socket.getInputStream())的方法。 (我并没有声称​​ 是这样实现的:我们只是在考虑。)没有什么可以实现的,你可以用流来比较它与==,告诉你是否这是一个新的流,每次像那样或总是相同的流。你读出的内容不受影响。