为什么FileInputStream read()没有阻塞?

QQQ*_*ons 5 java file blocking fileinputstream

我有一个Writer程序,它将一行文本写入文件,然后等待用户在写入另一行之前返回,然后退出.只有在那之后文件才关闭.代码:

public class Writer {

    Writer() {
    }

    public static String[] strings = 
        {
            "Hello World", 
            "Goodbye World"
        };

    public static void main(String[] args) 
        throws java.io.IOException {

        java.io.FileOutputStream pw =
            new java.io.FileOutputStream("myfile.txt");

        for(String s : strings) {
            pw.write(s.getBytes());
            System.in.read();
        }

        pw.close();
    }
}
Run Code Online (Sandbox Code Playgroud)

首先开始:

java作家

然后我还有一个读者程序,只要文件的写入尚未完成(即尚未调用pw.close()),应该(我预期)阻止.代码:

public class ReaderFIS extends Object {

    ReaderFIS() {
    }

    public static void main(String[] args) throws Exception {

        java.io.FileInputStream in = new java.io.FileInputStream("myfile.txt");

        int ch = -1;
        while((ch = in.read()) >= 0) {
         System.out.println("ch = " + ch);
     }
        System.out.println("Last ch = " + ch);

     System.out.println("exiting");
    }
}
Run Code Online (Sandbox Code Playgroud)

从...开始:

java ReaderFIS

现在我希望read()在读取第一个"Hello World"文本后阻塞,基于此在Javadoc文档中:

从此输入流中读取一个字节的数据.如果尚未提供输入,此方法将阻止.通过:http://docs.oracle.com/javase/6/docs/api/java/io/FileInputStream.html#read()

但阅读"Hello World"后,ReaderFIS立即完成,显然看到了EOF!所以它并不能阻止!它转储字符值,然后转-1,然后打印"退出".

输出:ch = 72 ch = 101 ch = 108 ch = 108 ch = 111 ch = 32 ch = 87 ch = 111 ch = 114 ch = 108 ch = 100最后ch = -1退出

我尝试的其他变体是:通过getChannel()读取,通过getChannel()检查是否可以使用lock()编辑,使用available(),使用缓冲区尝试read(),尝试readLine(),继续编写字符在每次写入之间暂停500毫秒的文件,而不是写入任何只是在Writer中保持文件打开的文件.
这些变化都不会导致ReaderFIS程序阻塞,它总是完成.

为什么读者程序不会阻止?我是否想念一些非常明显的东西?似乎ReaderFIS程序找到了EOF(-1),但为什么呢?该文件尚未被Writer程序关闭.

"搞笑"旁注:System.in.read()正在阻塞!(并等待用户按Enter键).

PS:在Windows XP和Suse Linux上试过这个.在Windows上,我无法在编写器运行时删除该文件(这是我所期望的).

此致,马可

And*_*rey 0

你稍微没明白是什么阻碍了。阻塞IO是指阻塞程序的执行,直到IO操作完成。close只需断开程序与文件的连接即可。如果您希望一个应用程序阻止另一个应用程序,您应该使用某种同步。