繁体   English   中英

是用于写入的Java FileInputStream锁定文件

[英]Is Java FileInputStream Locking File for writing

我正在两个独立的程序之间建立一个快速的桥梁。

一个程序写入文件,而我的程序同时从中读取。

似乎一旦我打电话给第一次阅读,写作就完全被阻止了。

为什么会发生这种情况?解决方法是什么?

 // Create Named Pipe
 Runtime.getRuntime.exec("mkfifo /tmp/mypipe")

 val stream = new FileInputStream("/tmp/mypipe")

 val in = new BufferedReader(new InputStreamReader(stream))

 // File opened for reading. No blocking at this point.

 while (true) {

   println(in.readLine())

   // File read. Now blocking.

 }

更新:

该文件实际上是使用mkfifo /tmp/mypipe创建的命名管道。 我尝试使用常规File ,它工作得很好 - 显示所有数据。

我使用命名管道因为我不想要磁盘IO开销。

如果我不得不打赌,我会说这是一个缓冲问题。

最初我以为BufferedReader可能会尝试填充它的整个缓冲区,但只要它读了一些就看起来很开心。 请参阅fill()方法。

如果您正在使用readLine() ,那么还有一个问题是您获得的输入是否包含换行符。

根据源程序产生的输出量,可能发生的另一件事是管道缓冲。 这个答案会有帮助吗? 您也可以尝试结束源程序(例如^C等),然后查看目标程序是否打印任何内容。

页面表明缓冲可能是一个问题:

但是,如果使用缓冲写入,则在刷新缓冲区之前,缓冲区不可供读取器使用。 当缓冲区写入的数据超过最大缓冲区大小(stdio.h中设置的BUFSIZ)时,或者当写入程序关闭管道时,会发生此刷新。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM