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

时间:2015-07-23 11:37:03

标签: java scala

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

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

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

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

def extractfailure():
    loginpage = html.fromstring(login())
    fail = loginpage.xpath('/html/body/table/tbody/tr/td[2]/table/tbody/tr[2]/td[17]/font')
    print fail

更新

此文件实际上是使用<tbody>创建的命名管道。我尝试使用常规 // 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. } 并且它工作正常 - 显示所有数据。

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

1 个答案:

答案 0 :(得分:6)

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

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

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

可能发生的另一件事,取决于源程序产生多少输出,与管道缓冲有关。 this answer会有帮助吗? 您也可以尝试结束源程序(例如^C等),然后查看目标程序是否打印任何内容。

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

  

但是,如果使用缓冲写入,则缓冲区不可用   到读者,直到刷新缓冲区。这种潮红发生时   写入缓冲区的数据多于最大缓冲区大小   (在stdio.h中设置BUFSIZ),或者当编写器关闭管道时。