Java 输入/输出流:流结束?

Java 输入/输出流:流结束?,java,io,stream,network-programming,Java,Io,Stream,Network Programming,我一直在想:一条小溪的尽头是什么 在java.io包中大多数readLine方法的javadoc中,您可以看到“如果到达流的末尾,则返回null”-尽管我实际上从未得到null,因为大多数流(在我最常使用的网络流的情况下)只是阻塞程序执行,直到有东西写入远程端的流中 有没有办法以实际的非异常抛出方式强制执行这种实际行为?我只是好奇…想想正在读取的文件。这里有一个流的结尾,文件的结尾。如果你试图阅读更多的东西,你根本就做不到。不过,如果您有网络连接,如果您只是等待发送更多数据,则不需要流结束 在文

我一直在想:一条小溪的尽头是什么

在java.io包中大多数readLine方法的javadoc中,您可以看到“如果到达流的末尾,则返回null”-尽管我实际上从未得到null,因为大多数流(在我最常使用的网络流的情况下)只是阻塞程序执行,直到有东西写入远程端的流中


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

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

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

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


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

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

简单地在开放流上阻塞更多数据不是EOF条件

我从来没有得到过一个空值,因为大多数流(在我最常使用的网络流的情况下)只是阻塞程序执行,直到有东西写入远程端的流中


不。您从未得到空值,因为对等方从未关闭连接。这就是“流的尽头”的意思。这并不意味着“暂时没有更多数据”。

使用FileInputStream读取文件。具体执行什么行为?您的意思是要阻止该程序,直到其他程序可用?使用readLine()从网络流读取时,使读取器返回null;EOF和EOS(tream)之间的确切区别是什么像“字符代码”这样的答案也同样适用valid@salbeira没有区别,实际上没有数据通过流传输(或从文件读取)。此结果由
InputStream
实现类生成。这是逻辑的结果,不是带内信号。实际上,我通过关闭远程端的套接字使读卡器返回null-显然,流已终止,但同时设置了一个指示器,以告诉试图从中读取的任何东西它实际上已结束(接收数据)。。。这是我等待在远端关闭连接时插入清理代码的时刻!你可以查一下