gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 20:31:03 25 4
gpt4 key购买 nike

我有一个 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();
}
}

首先从:

开始

java Writer

然后我还有一个阅读器程序,只要文件的写入尚未完成(即尚未调用 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 文档中的这一点:

Reads a byte of data from this input stream. This method blocks if no input is yet available. Via: http://docs.oracle.com/javase/6/docs/api/java/io/FileInputStream.html#read()

但是 ReaderFIS 在读取“Hello World”后立即完成并且显然看到了 EOF!所以它不会阻止!它转储字符值,然后是 -1,然后打印“exiting”。

输出: CH = 72 CH = 101 CH = 108 CH = 108 CH = 111 CH = 32 channel = 87 CH = 111 CH = 114 CH = 108 CH = 100 最后一个 channel = -1 退出

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

为什么阅读器程序不阻塞?我是不是漏掉了一些非常明显的东西? ReaderFIS 程序似乎找到了一个 EOF (-1),但为什么呢? Writer 程序尚未关闭该文件。

“有趣”旁注:System.in.read() 正在阻塞! (并等待用户按下 Enter)。

PS:在 Windows XP 和 Suse Linux 上试过这个。在 Windows 上,我无法在编写器运行时删除文件(正如我所料)。

问候,马可

最佳答案

FileInputStream 始终有输入可用:要么有剩余字节要读取,要么有 EOF,但一般来说它不会在读取时阻塞。您可能会在以下情况下被阻止:

  • 从控制台/终端读取
  • 从网络读取
  • 从管道读取
  • 从任何等待数据的流中读取数据。

文件流不必等待数据,因为它们始终有可用数据:在您的情况下,read() 基本上会随机获得以下之一:

  • 文件的旧版本
  • 文件的新版本
  • 文件的半更新版本。

关于java - 为什么 FileInputStream read() 没有阻塞?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3677862/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com