2009-10-27 41 views
8

我的查询是在什么情况下读取/写入到Java Pipe中的Linux Pipe的最佳方式?我已经正在使用java.io.RandomAccessFile中像使用Java读取/写入Linux管道使用Java

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

,然后将它传递给工作线程,其每2ms后把它读成

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

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

+0

什么是星号的连接? – 2009-10-27 16:46:48

+0

实际上,当您的计算机上安装了SS7卡时,通过用于Asterisk的Zaptel驱动程序创建/ dev/zap/16。 Asterisk有读取这个管道的模块,但是使用本地代码。我正试图让这个工作在Java上。脱离主题,但如果你想尝试在这里安装Asterisk + SS7是我的经验http://amitbhayani.blogspot.com/2009/04/asterisk-ss7.html – 2009-10-28 02:02:24

回答

11

我从来没有尝试过这个,但是你做什么感觉错了。按照定义,Linux管道是先进先出(FIFO)。因此,您应该只能按照您写入的顺序读取字节,而不是随机读取。我建议使用正常的File来代替,它应该可以正常工作。

+1

你的意思是一个普通的'FileInputStream'吗?这也是我第一次尝试。 – erickson 2009-10-27 16:41:46

+1

'FileInputStream'和'FileOutputStream'分别是, – sfussenegger 2009-10-27 16:50:51

+0

有趣...我在java中的管道上找到的每个教程都使用RandomAccessFile。 – Belovoj 2018-02-06 09:43:58

6

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

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

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

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