2013-12-18 137 views
5

我一直在想:流的结束是什么?输入/输出流:流结束?

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

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

+0

用FileInputStream读取文件。 –

+0

准确执行什么行为?你的意思是阻止程序,直到其他东西可用? –

+0

使用readLine()从网络流读取时,会导致Reader返回null; – salbeira

回答

8

想到正在读取的文件。那里有流结束,文件结束。如果你试图超越这个范围,你根本就做不到。如果您有网络连接,则无需等待更多数据发送即可。

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

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

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

+0

我实际上设法让读者通过关闭远程端的套接字来返回null--显然流被终止了,但是还设置了一个指示器来告诉任何试图从它读取它的文字结束的地方(接收数据)...这是我等待远端关闭连接时等待插入清理代码的时刻! – salbeira

+0

您可以勾选['configureBlocking'](http://docs.oracle.com/javase/7/docs/api/java/nio/channels/spi/AbstractSelectableChannel.html#configureBlocking(boolean))和['available' ](http://docs.oracle.com/javase/7/docs/api/java/io/InputStream。html#available()) –

0

在某些情况下,套接字将被关闭,并且无法通过该流发送更多数据。这是当InputStream将通过从read()及其超载返回-1来发信号通知EOF。这个状态是不可逆转的。那条小河已经死了。

只是阻止更多的数据在开放流不是一个EOF条件。

+0

EOF和EOS(tream)有什么区别? - 类似“字符代码”的答案也是有效的 – salbeira

+0

@salbeira没有区别,实际上没有数据通过流传输(或从文件读取)。这个结果是由'InputStream'实现类生成的。这是逻辑的结果,它不是带内信号。 – erickson

1

我从来没有真正得到了空,因为大多数流(在我最经常使用的网络流的情况下),直到东西写入流在远端

只是阻止程序执行

不可以,因为对方永远不会关闭连接,所以你永远不会得到空。这就是'流结束'的含义。这并不意味着“暂时没有更多的数据”。