【问题标题】:Input/Output Stream : End of Stream?输入/输出流:流结束?
【发布时间】:2014-01-06 01:38:44
【问题描述】:

我一直在想:流的结尾是什么?

在 java.io 包中大多数 readLine 方法的 javadoc 中,您可以读到“如果到达流的末尾,这将返回 null”——尽管我实际上从未得到 null,因为大多数流(在这种情况下我最常使用的网络流)只是阻止程序执行,直到将某些内容写入远程端的流中

有没有办法以实际的非异常抛出方式强制执行这种实际行为?我只是好奇...

【问题讨论】:

  • 使用 FileInputStream 读取文件。
  • 究竟执行什么行为?您的意思是在其他可用之前阻止该程序?
  • 使用 readLine() 从网络流中读取时导致 Reader 返回 null;

标签: java io stream network-programming


【解决方案1】:

我实际上从来没有得到空值,因为大多数流(在我最常使用的网络流的情况下)只是阻止程序执行,直到将某些内容写入远程端的流中

没有。您永远不会得到 null,因为对等方从未关闭连接。这就是“流结束”的意思。这并不意味着“暂时没有更多数据”。

【讨论】:

    【解决方案2】:

    想一想正在读取的文件。那里有一个流的结尾,文件的结尾。如果你试图超越这一点,你根本就做不到。但是,如果您有网络连接,则只需等待发送更多数据,就不需要结束流。

    在文件的情况下,我们知道没有更多数据要读取。在网络流的情况下,我们(通常)不这样做。

    当没有更多数据可用时阻止FileReader,当有数据时唤醒:简单的答案是:你不能。根本区别在于您主动读取文件,但当您收听网络流时,您是被动读取。当某些东西来自网络时,您的硬件会向操作系统发送一个短信号,然后操作系统会将新数据提供给您的 JVM,然后 JVM 会唤醒您的进程以读取新数据(可以这么说)。但是我们没有文件,至少没有立即。

    一种可能的解决方法是对您拥有的StreamReader 进行包装,并在文件更改时通知一个侦听器,然后唤醒您进一步阅读。在 Java 7 中,您可以使用 WatchService

    【讨论】:

    • 我实际上设法通过关闭远程端的套接字来让阅读器返回 null - 显然流已终止,但也设置了一个指示器来告诉任何试图从中读取它的东西已经真正结束(接收数据)......这是我等待远程端关闭连接时插入清理代码的时刻!
    【解决方案3】:

    在某些时候,套接字将被关闭,并且无法通过该流发送更多数据。这是InputStream 将通过从read() 及其重载返回-1 来发出EOF 信号的时候。这种状态是不可逆的。那个流已经死了。

    简单地阻塞打开流上的更多数据不是 EOF 条件。

    【讨论】:

    • EOF 和 EOS(tream) 之间的确切区别是什么? - 像“字符代码”这样的答案也是有效的
    • @salbeira 没有区别,实际上没有数据通过流传输(或从文件中读取)。此结果由InputStream 实现类生成。这是逻辑的结果,不是带内信号。
    猜你喜欢
    • 2011-11-03
    • 2016-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多