是用于写入的Java FileInputStream锁定文件
我正在两个独立的程序之间建立一个快速的桥梁 一个程序写入一个文件,而我的程序同时从中读取 看来,我一打电话给第一个读者,文字就被完全封锁了 为什么会发生这种情况,解决办法是什么是用于写入的Java FileInputStream锁定文件,java,scala,Java,Scala,我正在两个独立的程序之间建立一个快速的桥梁 一个程序写入一个文件,而我的程序同时从中读取 看来,我一打电话给第一个读者,文字就被完全封锁了 为什么会发生这种情况,解决办法是什么 // Create Named Pipe Runtime.getRuntime.exec("mkfifo /tmp/mypipe") val stream = new FileInputStream("/tmp/mypipe") val in = new BufferedReader(new InputStr
// 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
创建的命名管道。我试着用一个普通的文件来使用它,结果很好——所有数据都显示出来了
我使用命名管道是因为我不希望磁盘IO开销。如果我不得不打赌,我会说这是缓冲问题
起初,我认为这可能会试图填满它的整个缓冲区,但它看起来很高兴,只要它读了一些东西。请参阅fill()
方法
如果您使用的是readLine()
,那么还存在一个问题,即您获得的输入是否包含换行符
另一件可能发生的事情是管道缓冲,这取决于源程序产生的输出量。会有帮助吗?
您也可以尝试结束源程序(例如,^C
或类似程序),然后查看目标程序是否打印任何内容
page建议缓冲可能是一个问题:
但是,如果使用缓冲写入,则缓冲区不可用
直到刷新缓冲区为止。这种冲洗发生在何时
写入缓冲区的数据多于最大缓冲区大小
(在stdio.h中设置BUFSIZ),或在编写器关闭管道时
你能把另一个程序也给我看一下吗?@Vlad我没有源代码,而且它不是公共的。它所做的只是写不读。while循环和缺少正确关闭是简单的样板。我尝试在线程插入前后检查读取数据的文件长度。sleep(5000)
在BufferedReader
创建和首次读取之间-相应的文件长度分别为11498字节和15521字节,99行和131行。因此,链接的答案似乎不是它。使用$cat/dev/uradom | hextump-C>/tmp/mypipe
作为写入命令,使用Scala程序作为读卡器,它可以无限流式传输。您的源程序中是否有任何东西,例如,使其需要一些用户输入或类似的东西?没有用户输入或请求-只是单向隧道。我将尝试使用cat
。似乎可以使用cat
。作者可能在做什么,阅读?是否可能对输出文件进行假设,例如,可能是终端,或试图在文件中查找,或诸如此类?