Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
是用于写入的Java FileInputStream锁定文件_Java_Scala - Fatal编程技术网

是用于写入的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
。作者可能在做什么,阅读?是否可能对输出文件进行假设,例如,可能是终端,或试图在文件中查找,或诸如此类?