输入/输出流:流结束?

时间:2013-12-18 02:22:33

标签: java io stream network-programming

我一直想知道:流的结束是什么?

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

是否有办法以实际的非例外投掷方式强制执行这种行为?我只是好奇......

3 个答案:

答案 0 :(得分:9)

想一下正在阅读的文件。那里有一个流的结尾,文件的结尾。如果你试图超越它,你就是不能。如果您有网络连接,如果您只是等待发送更多数据,则无需成为流的末尾。

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

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

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

答案 1 :(得分:1)

  

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

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

答案 2 :(得分:0)

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

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