2009-10-27 12 views
8

का उपयोग कर लिनक्स पाइप को पढ़ें/लिखें लिखें मेरी क्वेरी जावा में लिनक्स पाइप को पढ़ने/लिखने का सबसे अच्छा तरीका क्या है? मैं पहले से हीजावा

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

तरह java.io.RandomAccessFile उपयोग कर रहा हूँ और उसके बाद कार्यकर्ता धागा जो के रूप में

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

यह पाइप से इसे पढ़ा है हर 2ms के बाद इसे पढ़ता करने के लिए इसे पारित, लेकिन मुझे लगता है कि संदेह है कुछ बाइट ओवरराइट कर रहे हैं। क्या आप जानते हैं कि लिनक्स (उबंटू) पाइप के लिए बफर को कैसे संभालता है?

+0

तारांकन को क्या संबंध है पढ़ा है? –

+0

असल में/dev/zap/16 जेप्टेल ड्राइवर द्वारा एस्टरिस्क के लिए उपयोग किया जाता है जब आपके मशीन पर एसएस 7 कार्ड स्थापित होता है। तारांकन में मॉड्यूल है जो इस पाइप को पढ़ता है लेकिन मूल कोड में है। मैं जावा पर यह काम करने की कोशिश कर रहा हूं। विषय के बाहर लेकिन यदि आप में से कोई भी एस्टेरिक्स्क + एसएस 7 स्थापित करने का प्रयास कर रहा है तो मेरा अनुभव है http://amitbhayani.blogspot.com/2009/04/asterisk-ss7.html –

उत्तर

11

मैंने कभी यह कोशिश नहीं की है लेकिन आपके काम को क्या गलत लगता है। परिभाषा के अनुसार लिनक्स पाइप फर्स्ट इन - फर्स्ट आउट (एफआईएफओ) हैं। इसलिए आपको केवल उसी क्रम में बाइट्स को पढ़ने में सक्षम होना चाहिए जैसा आपने लिखा है - यादृच्छिक रूप से नहीं। मैं इसके बजाय सामान्य File का उपयोग करने का सुझाव दूंगा और इसे ठीक काम करना चाहिए।

+1

क्या आपका मतलब सामान्य 'फ़ाइल इनपुट स्ट्रीम' है? यही वह है जो मैं पहले भी कोशिश करता हूं। – erickson

+1

'फ़ाइल इनपुटस्ट्रीम' और 'फ़ाइलऑटपुटस्ट्रीम' क्रमशः, हाँ – sfussenegger

+0

दिलचस्प ... जावा में पाइप पर मिले प्रत्येक ट्यूटोरियल RandomAccessFile का उपयोग कर रहा है। – Belovoj

6

पाइप्स को जावा द्वारा विशेष रूप से किसी भी तरह से संभाला नहीं जाता है, जहां तक ​​मुझे पता है। आप फ़ाइल को लिखने और लिखने के लिए बस खोलते हैं।

आप पाइप में कुछ भी "ओवरराइट" नहीं कर सकते हैं, क्योंकि आप पाइप में नहीं खोज सकते हैं। इसी कारण से RandomAccessFile उपयोग करने का सबसे अच्छा विकल्प नहीं है (चूंकि एक पाइप स्पष्ट रूप से एक यादृच्छिक एक्सेस फ़ाइल नहीं है)। मैं इसके बजाय FileOutputStream का उपयोग करने का सुझाव दूंगा।

यह भी ध्यान दें कि read() बफर भरने तक पढ़ने की गारंटी नहीं है! यह एक बाइट भी पढ़ सकता है और आपको पूर्ण बफर पढ़ने के लिए इसके रिटर्न वैल्यू और संभवतः लूप की जांच करनी होगी।

0

मुझे लगता है कि आप लिखने के बाद फ्लश नहीं कर सकते हैं, इसलिए आउटपुटस्ट्रीम.फ्लश() अक्सर पढ़ते हैं और पढ़ते हैं, कम से कम यह देखने के लिए कि आपका डेटा किस प्रकार से हो रहा है या नहीं। उदा। प्रक्रिया 1 में रीडोनली मोड (FileInputStream) में एक नामित पाइप खोलने के लिए, प्रक्रिया 2 में इसे लिखने के तरीके (FileOutputStream) में खोलें, इसलिए प्रक्रिया 2 में जो कुछ भी आप लिखते हैं उसे प्रक्रिया 1 में पढ़ा जाएगा।

भी

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