2016-08-04 7 views
6

में समवर्ती पढ़ने/लिखने की फ़ाइल मुझे अपने जावा एप्लिकेशन से एक टेक्स्ट फ़ाइल पढ़नी है।जावा

फ़ाइल में कई पंक्तियां हैं और यह फ़ाइल बाहरी अज्ञात एप्लिकेशन से प्रत्येक एक्स मिनट को अपडेट की जाती है जो फ़ाइल में नई लाइनें जोड़ती है।

मुझे फ़ाइल से सभी पंक्तियां पढ़नी पड़ेगी और फिर मुझे उन सभी रिकॉर्ड्स को हटाना होगा जिन्हें मैंने अभी पढ़ा है।

क्या मुझे पंक्ति में फ़ाइल पंक्ति पढ़ने, मुझे पढ़ने वाली प्रत्येक पंक्ति को हटाने और साथ ही बाहरी एप्लिकेशन को अन्य पंक्तियों को फ़ाइल में जोड़ने की इजाजत देने की संभावना है?

इस फ़ाइल में एक सांबा में स्थित है तो मैं jCIFS उपयोग कर रहा हूँ पढ़ने/फ़ाइल और BufferedReader जावा वर्ग लिखने के लिए फ़ोल्डर साझा की है।

धन्यवाद अग्रिम में

+0

एक फ़ाइल को बदलना जो आपके नियंत्रण में नहीं है, जो आपके नियंत्रण में नहीं है, एक बुरा विचार है। आपको हटाने की आवश्यकता क्यों है?शायद फाइल को बदलने के बिना, अब तक कितनी लाइनें आपने पढ़ी हैं, इस मार्कर को बनाए रखने के लिए पर्याप्त होगा? – RealSkeptic

+0

यह ऐसी चीज है जो 'सॉकेट राइटिंग' और 'रीस्टफुल पोस्ट' कमांड के लिए बनाई गई थी। –

+0

@RealSkeptic मुझे उन पंक्तियों को हटाने या अपडेट करने की आवश्यकता है जिन्हें मैंने अभी पढ़ा है क्योंकि मुझे लगता है कि पंक्तियों को "पहले से संसाधित" के रूप में चिह्नित करने का सबसे आसान तरीका है। एक पंक्ति को संसाधित करने के बाद, मुझे एक MySQL तालिका में स्टोर करना होगा, इसलिए मुझे फ़ाइल में पंक्तियों को छोड़ने की आवश्यकता नहीं है। –

उत्तर

1

समस्या हम कैसे बाहरी अनुप्रयोग लिखने पता नहीं है और/या इस फाइल को पुन: उपयोग है। यदि आप बाहरी अनुप्रयोगों को सही ढंग से चलाने के लिए काउंटर का उपयोग करते हैं तो यह पंक्ति हो सकती है ...

कोई अच्छा समाधान नहीं है जब तक कि आप नहीं जानते कि अन्य ऐप कैसे काम करता है।

2

मैं आपकी समस्या का सही समाधान नहीं पता है, लेकिन मैं इसे दूसरे तरीके से हल होगा: तो

  • फ़ाइल का नाम बदलें (यह एक टाइमस्टैम्प के साथ एक अनन्य नाम देना)
  • appender काम करेंगे स्वचालित रूप से इसे
  • प्रक्रिया अपने समय मुहर लगी फाइलों को फिर से बनाना (उन्हें नष्ट करने की कोई जरूरत है, उन्हें ही स्थान पर रखें ताकि आप बाद में जांच कर सकते हैं कि क्या हुआ)
+0

"एपेंडर जॉब तब स्वचालित रूप से इसे फिर से बना देगा" -> सुनिश्चित नहीं है, उदाहरण के लिए यदि यह केवल लॉन्च पर करता है। – N0un

+0

@ N0un यकीन नहीं, सच है, लेकिन एक शॉट के लायक है। –

+0

@ सेनपैट्रिकफ्लॉइड जब तक कोई ग्राहक अपने आवेदन को उत्पादन वातावरण में एक बहुत ही विशिष्ट तरीके से ऐसा करने की अपेक्षा नहीं करता है। –

0

क्या मुझे पंक्ति में फ़ाइल पंक्ति को पढ़ने, मुझे पढ़ने वाली प्रत्येक पंक्ति को हटाने और साथ ही बाहरी एप्लिकेशन को अन्य पंक्तियों को फ़ाइल में जोड़ने की इजाजत देने की संभावना है?

हां, आप एक ही फाइल को कई प्रक्रियाओं से पढ़ने और लिखने के लिए खोल सकते हैं। लिनक्स में, उदाहरण के लिए, आपको एक ही फ़ाइल के लिए दो अलग file descriptors मिलेगा। PIPE_BUF, or 4096 bytes in Linux, के आकार के तहत फ़ाइल लिखने के लिए यह मानना ​​सुरक्षित है कि संचालन परमाणु हैं, जिसका अर्थ है कि कर्नेल लॉकिंग को संभालने और दौड़ की स्थिति को रोकने के लिए अनलॉक कर रहा है।

मानने की प्रक्रिया ए फ़ाइल को लिख रहा है इसे ऐपेंड के रूप में खोला गया है, फिर प्रत्येक बार प्रक्रिया ए कर्नेल को write() पर बताती है, यह पहले फ़ाइल (फ़ाइल के अंत) के आकार की तलाश करेगी। इसका मतलब है कि आप प्रोसेस बी से फ़ाइल में डेटा को सुरक्षित रूप से हटा सकते हैं जब तक यह प्रक्रिया ए के लेखन कार्यों के बीच में किया जाता है और जब तक प्रक्रिया ए से लिखने के संचालन PIPE_BUF से अधिक नहीं होते हैं, लिनक्स गारंटी देता है कि वे परमाणु होंगे, यानी प्रक्रिया ए स्पैम लिखने के संचालन और प्रक्रिया बी कर सकते हैं डेटा लगातार हटा/लिख सकते हैं, और कोई फर्क नहीं पड़ता व्यवहार परिणाम होगा।

जावा आपको implemented File Locks प्रदान करता है। लेकिन यह समझना महत्वपूर्ण है कि यह केवल "सलाहकार" है, "अनिवार्य नहीं।" जावा प्रतिबंध लागू नहीं करता है, दोनों प्रक्रिया को यह जांचने के लिए एक जांच लागू करनी चाहिए कि कोई अन्य प्रक्रिया लॉक रखती है या नहीं।

+0

लॉकिंग? लिनक्स इसे संभाल लेंगे? क्या आप दस्तावेज दिखा सकते हैं जो इस दावे की पुष्टि करता है? – RealSkeptic

+0

@ रीयलस्केप्टिक मुझे लिनस टोरवाल्ड से आधिकारिक पोस्ट नहीं मिल रहा है। लेकिन यदि आप इसे Google करते हैं तो आपको पुस्तकों, वेबसाइटों और ऑपरेटिंग सिस्टम पाठ्यक्रमों में साक्ष्य की एक बहुतायत मिल जाएगी। [यहां एक उदाहरण है] (http://www.cim.mcgill.ca/~franco/OpSys-304-427/lecture-notes/node27.html)। इसके अलावा, अधिक [stackoverflow समर्थन] (http://stackoverflow.com/a/2751750/1241782)। –

+0

* फ़ाइल के लिए PIPE_BUF, या लिनक्स में 4096 बाइट्स के आकार के तहत लिखते हैं, यह मानना ​​सुरक्षित है कि ऑपरेशन परमाणु हैं, जिसका अर्थ है कि कर्नेल लॉकिंग को संभालने और दौड़ की स्थिति को रोकने के लिए अनलॉक कर रहा है। * आमतौर पर सच - लेकिन इस मामले में एक साझा फ़ाइल सिस्टम जिसे स्पष्ट रूप से नेटवर्क कनेक्शन में अपडेट किया जा रहा है। एक फ़ाइल से पढ़ना एक स्थानीय फ़ाइल पर निम्न स्तर के सी कोड के साथ विश्वसनीय रूप से करने के लिए पर्याप्त है - इसे नेटवर्क में जावा में करना * और * लेखन प्रक्रिया के साथ फ़ाइल को एक साथ संशोधित करना बेहद मुश्किल हो रहा है । –