【问题标题】:Read/Write to linux Pipe using Java使用 Java 读/写到 linux Pipe
【发布时间】:2010-12-10 13:32:40
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 和星号有什么关系?
  • 实际上 /dev/zap/16 是由用于 Asterisk 的 Zaptel 驱动程序创建的,当您的机器上安装了 SS7 卡时。 Asterisk 有一个模块可以读取这个管道,但是是本地代码。我正试图让它在 Java 上运行。题外话,但如果你们中的任何人试图安装 Asterisk + SS7 这是我的经验amitbhayani.blogspot.com/2009/04/asterisk-ss7.html

标签: java pipe named-pipes


【解决方案1】:

我认为您可能不会在写入后刷新,因此 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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 你的意思是普通的FileInputStream吗?这也是我首先要尝试的。
      • FileInputStreamFileOutputStream 分别是,是的
      • 有趣...我在 java 中的管道上找到的每个教程都使用 RandomAccessFile。
      猜你喜欢
      • 2013-09-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多