Java IO读者 - 它们如何工作?

时间:2014-08-18 01:18:36

标签: java io connection inputstream bufferedreader

我正在处理需要从服务器读取多个文件的项目。 我想知道我是否可以读取输出并使用相同的实例连接到其他地方。 显然我可以(见下文)。

试过这个伪代码:

c.connect(google)
BufferedReader r1 = ... c.getInputStream();

c.connect(somewhereelse)
BufferedReader r2 = ... c.getInputStream();
print(r1)
print(r2)

输出正确。

我不知道IO流是如何工作的,或者这个conn函数返回的是什么(我将在冬季晚上检查: - )

真实问题:我可以依赖这样一个事实:我会一直得到正确的数据吗? 即,缓冲读取器是否保留对不再与连接本身绑定的数据对象的引用?

1 个答案:

答案 0 :(得分:0)

不,我认为你不能相信这段代码。 InputStream需要连接来获取数据。 例如,如果您打开java.net.SocketInputStream(网址连接使用此流)并查看read方法,您会看到以下代码:

    // connection reset
    if (impl.isConnectionReset()) {
        throw new SocketException("Connection reset");
    }

你可以看到,如果存在,该流会尝试获取缓冲数据:

    /*
     * We receive a "connection reset" but there may be bytes still
     * buffered on the socket
     */
    if (gotReset) {...}

和lower正在检查连接丢失:

   /*
    * If we get here we are at EOF, the socket has been closed,
    * or the connection has been reset.
    */
    if (impl.isClosedOrPending()) {
        throw new SocketException("Socket closed");
    }

关于您的工作实施:

  • 首先猜测你没有关闭你的第一个连接。将c链接到另一个连接并未关闭之前的连接。
  • 第二个猜测是您的数据已缓冲。通过连接或缓冲读取器。

我的想法可能是错的,但它看起来是真实的。