9

我的问题是在 Java 中读取/写入 linux Pipe 的最佳方式是什么?我已经在使用 java.io.RandomAccessFile 之类的了

   RandomAccessFile file = new RandomAccessFile("/dev/zap/16", "rw");

然后将其传递给工作线程,工作线程每 2ms 读取一次

  byte[] buffer = new byte[16];
  file.read(buffer);

它确实从管道中读取它,但我怀疑某些字节被覆盖了。你知道 linux (ubuntu) 如何处理管道的缓冲区吗?

4

3 回答 3

11

我自己从未尝试过,但是您的所作所为感觉不对。根据定义,Linux 管道是先进先出 (FIFO)。因此,您应该只能以与写入字节相同的顺序读取字节 - 而不是随机读取。我建议改用普通的File,它应该可以正常工作。

于 2009-10-27T16:40:54.853 回答
6

据我所知,Java 并没有以任何特殊方式处理管道。您只需打开文件进行写入并写入即可。

您不能真正“覆盖”管道中的任何内容,因为您无法在管道中查找。出于同样的原因, aRandomAccessFile不是最明智的选择(因为管道显然不是随机访问文件)。我建议使用 aFileOutputStream代替。

另请注意,read()在缓冲区已满之前不能保证读取!它也可以读取单个字节,您需要检查它的返回值并可能循环读取完整的缓冲区。

于 2009-10-27T16:42:02.760 回答
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

于 2009-10-27T17:09:48.413 回答