我正在两个独立的程序之间建立一个快速的桥梁。
一个程序写入文件,而我的程序同时从中读取。
似乎只要我打电话给第一次阅读就完全阻止了写作。
为什么会发生这种情况?解决方法是什么?
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开销。
答案 0 :(得分:6)
如果我不得不打赌,我会说这是一个缓冲问题。
最初我认为BufferedReader
可能会尝试填充整个缓冲区,但只要它读了一些内容,它看起来就很开心。请参阅fill()
方法。
如果您正在使用readLine()
,那么您输入的输入是否包含换行符也是一个问题。
可能发生的另一件事,取决于源程序产生多少输出,与管道缓冲有关。 this answer会有帮助吗?
您也可以尝试结束源程序(例如^C
等),然后查看目标程序是否打印任何内容。
This页面表明缓冲可能是一个问题:
但是,如果使用缓冲写入,则缓冲区不可用 到读者,直到刷新缓冲区。这种潮红发生时 写入缓冲区的数据多于最大缓冲区大小 (在stdio.h中设置BUFSIZ),或者当编写器关闭管道时。