使用Java读/写linux管道

时间:2009-10-27 16:32:32

标签: java pipe named-pipes

我的查询是关于在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)如何处理管道的缓冲区吗?

3 个答案:

答案 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