2009-10-27 36 views
8

Truy vấn của tôi là cách tốt nhất để đọc/ghi vào một Ống linux bằng Java là gì? Tôi đã đang sử dụng java.io.RandomAccessFile nhưĐọc/Ghi vào ống linux bằng cách sử dụng Java

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

và sau đó đi qua nó để sợi nhân mà đọc nó sau mỗi 2ms như

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

Nó đọc nó từ ống, nhưng tôi nghi ngờ rằng một số byte bị ghi đè. Bạn có biết cách linux (ubuntu) xử lý bộ đệm cho đường ống không?

+0

kết nối đến Asterisk là gì? –

+0

Trên thực tế,/dev/zap/16 được tạo bởi trình điều khiển Zaptel được sử dụng cho Asterisk khi bạn đã cài đặt thẻ SS7 trên máy của mình. Asterisk có mô-đun đọc đường ống này nhưng có mã gốc. Tôi đang cố gắng để có được điều này làm việc trên Java. Trong số các chủ đề nhưng nếu bất kỳ ai trong số các bạn cố cài đặt Asterisk + SS7 thì đây là trải nghiệm của tôi http://amitbhayani.blogspot.com/2009/04/asterisk-ss7.html –

Trả lời

11

Tôi chưa bao giờ thử điều này bản thân mình nhưng những gì bạn làm chỉ cảm thấy sai. Các ống Linux là First in - First out (FIFO) theo định nghĩa. Do đó bạn chỉ có thể đọc các byte theo cùng thứ tự như bạn đã viết chúng - không phải ngẫu nhiên. Tôi khuyên bạn nên sử dụng một cách bình thường File thay vào đó và nó sẽ hoạt động tốt.

+1

Bạn có nghĩa là một 'FileInputStream' bình thường không? Đó là những gì tôi muốn thử đầu tiên, quá. – erickson

+1

'FileInputStream' và' FileOutputStream' tương ứng, có – sfussenegger

+0

Thú vị ... Mọi hướng dẫn tôi tìm thấy trên các đường ống trong java đều sử dụng RandomAccessFile. – Belovoj

6

Ống không được xử lý theo bất kỳ cách nào đặc biệt bởi Java theo như tôi biết. Bạn chỉ cần mở tệp để viết và viết cho nó.

Bạn thực sự không thể "ghi đè lên" bất cứ điều gì trong một đường ống, vì bạn không thể tìm kiếm trong một đường ống. Vì lý do tương tự, RandomAccessFile không phải là lựa chọn thông minh nhất để sử dụng (vì đường ống rõ ràng là không phải là một tệp truy cập ngẫu nhiên). Thay vào đó, tôi khuyên bạn nên sử dụng một số FileOutputStream.

Cũng lưu ý rằng read() không được bảo đảm để đọc cho đến khi bộ đệm đầy! Nó có thể đọc một byte đơn và bạn cần kiểm tra giá trị trả về của nó và có thể lặp lại để đọc bộ đệm đầy đủ.

0

Tôi nghĩ rằng bạn có thể không đỏ mặt sau khi viết, do đó, làm OutputStream.flush() thường và đọc có thể là một byte tại thời điểm, ít nhất là để xem nếu dữ liệu của bạn đang nhận được thông qua. ví dụ: để bắt đầu với việc mở một đường ống có tên trong chế độ chỉ đọc (FileInputStream) trong process1, mở nó trong chế độ ghi (FileOutputStream) trong process2, vì vậy bất cứ điều gì bạn viết trong process2 sẽ được đọc trong process1.

cũng đọc

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

Các vấn đề liên quan