我的查询是关于在Java中读取/写入Linux管道的最佳方法是什么?我已经在使用java.io.RandomAccessFile,如
RandomAccessFile file = new RandomAccessFile("/dev/zap/16", "rw");
然后将其传递给工作线程,该工作线程每隔2ms读取一次
byte[] buffer = new byte[16];
file.read(buffer);
它确实从Pipe读取它,但我怀疑有些字节被覆盖了。你知道linux(ubuntu)如何处理管道的缓冲区吗?
答案 0 :(得分:11)
我自己从来没有尝试过,但你的行为感觉错了。根据定义,Linux管道是先进先出(FIFO)。因此,您应该只能以与编写它们相同的顺序读取字节 - 而不是随机读取。我建议使用正常的File
,它应该可以正常工作。
答案 1 :(得分:6)
据我所知,Java不会以任何特殊方式处理管道。您只需打开文件进行写入并写入即可。
你不能真正“覆盖”管道中的任何东西,因为你无法在管道中寻找。出于同样的原因,RandomAccessFile
不是最明智的选择(因为管道明确地不是随机访问文件)。我建议改用FileOutputStream
。
另请注意,在缓冲区已满之前,read()
无法保证读取!它也可以读取单个字节,你需要检查它的返回值,并可能循环读取完整的缓冲区。
答案 2 :(得分:0)
我认为你写完后可能不会刷新,所以经常输出OutputStream.flush()并且读取可能是一个字节,至少是为了看你的数据是否正常。 例如首先在process1中以只读模式(FileInputStream)打开一个命名管道,在process2中以写入模式(FileOutputStream)打开它,这样你在process2中编写的任何内容都将在process1中读取。
也读
http://www.tldp.org/LDP/lpg/node15.html
http://www.unixguide.net/unix/programming/2.10.5.shtml
http://www.unixguide.net/unix/programming/2.10.6.shtml