2009-10-27 80 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