5

该问题类似于以下两个问题。

但我仍然不能完全理解它。

到目前为止,我认为以下代码中的read()方法将由于空文件“test.txt”而阻塞。

FileInputStream fis = new FileInputStream("c:/test.txt");
System.out.println(fis.read());
System.out.println("to the end");

实际上它会打印-1,我想知道为什么。

javadoc 说This method blocks if no input is yet available

没有可用的输入”是什么意思?

谢谢。

4

4 回答 4

5

您的问题的答案可以在.read() 的 JavaDoc 中找到:

如果还没有输入可用,则此方法会阻塞。

返回: 数据的下一个字节,如果到达文件末尾,则返回 -1。

所以,一个空文件会让你立即-1(而不是read()阻塞)

  • 有可用输入,因为文件存在
  • ...但它是空的,所以立即EOF。

......没有可用的输入......情况可能会发生,例如。当一个人从命名管道而不是普通文件中读取时,管道的另一端还没有写任何东西。

干杯,

于 2013-03-05T08:16:04.027 回答
3

FileInputStream可用于读取普通文件以外的内容。一个明显的例子是命名管道:如果您在另一端写入管道之前尝试从管道读取,则读取操作将阻塞。

于 2013-03-05T08:21:28.740 回答
1

这可能会按如下方式进行交互:FileInputStream.read调用本机方法,本机方法进行读取系统调用并阻塞等待操作系统将字节从文件读取到缓冲区并在准备好时返回。也就是说,FileInputStream.read使用同步 I/O 从文件中读取数据,而不是使用非阻塞、异步 I/O。

于 2013-03-05T08:37:05.803 回答
1

您不能将“没有可用的输入”解释为“您位于 EOF 并且将不再有可用的输入”。它们是不同的条件。后者返回-1。

通常,从文件中读取的所有内容都会阻塞,直到数据可用。磁盘必须绕到正确的位置,磁头必须寻找正确的轨道。您还需要考虑共享驱动器上的文件或命名管道的文件,这两者都涉及网络操作,也可能会阻塞。

于 2013-03-05T08:50:39.777 回答