我有一个Writer程序,它将一行文本写入文件,然后等待用户在写入另一行之前先返回,然后退出。只有在文件关闭之后。代码:为什么FileInputStream的read()没有被阻塞?
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();
}
}
开始先用:
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");
}
}
开始:
的Java ReaderFIS
现在我预期的read()读取第一个 “Hello World” 文本后的阻拦,基于此Javadoc文档:
中读取数据的从该输入流的一个字节。如果没有输入可用,此方法会阻止。 途经:http://docs.oracle.com/javase/6/docs/api/java/io/FileInputStream.html#read()
但ReaderFIS正在读的 “Hello World”,显然后立即进行看到一个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()检查是否它可以是锁()的,使用可用的(),试图使用读()缓冲区,尝试readLine(),不断写入字符在每次写入之间暂停500毫秒,不写任何文件,只是在写入器中保持文件打开。
这些变化都不会导致ReaderFIS程序阻塞,它总是结束。
为什么读者程序不能阻止?我错过了非常明显的东西吗?看来ReaderFIS程序找到EOF(-1),但为什么?该文件尚未被Writer程序关闭。
“有趣”的注释:System.in.read()被阻止! (并等待用户按Enter键)。 PS:在Windows XP和Suse Linux上试用过。在Windows上,我无法在编写器运行时删除文件(这是我的预期)。
问候, 马尔科
当你写入磁盘时,你强制使用EOF,不是吗? EOF仅在追加新信息时才会移动。但是磁盘上的块必须有一个EOF ... – jcolebrand 2010-09-09 15:10:46
所以你说EOF总是被写入,因为一个文件总是需要一个。但我认为EOF只是在冲洗和关闭文件后才写完。但这意味着我的read()在读取文件时永远不会阻塞,因为* always * EOF并且即使文件为空也总是返回-1。那么JavaDoc不正确? – QQQuestions 2010-09-09 16:29:07