FileInputStream.read()什么时候阻止?

时间:2013-03-05 08:11:21

标签: java inputstream blocking java-io fileinputstream

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

但我仍然无法完全理解它。

到目前为止,我认为以下代码中的 read()方法会因空文件'test.txt'而被阻止。

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

实际上它会打印-1,我想知道原因。

javadoc说如果没有可用的输入,此方法会阻止

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

感谢。

4 个答案:

答案 0 :(得分:5)

您的问题的答案可以在JavaDoc for .read()

中找到
  

如果尚未提供输入,此方法将阻止。

  

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

因此,空文件会立即让您-1(而不是read()阻止)

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

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

干杯,

答案 1 :(得分:3)

FileInputStream可用于读取普通文件以外的内容。一个明显的例子是named pipe:如果你试图在另一方写入之前从管道读取,那么读取操作将被阻止。

答案 2 :(得分:1)

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

答案 3 :(得分:1)

您无法解释“没有输入可用”#39;因为你已经定位在EOF,并且不再有任何输入可用'。他们是不同的条件。后者返回-1。

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