2011-06-23 21 views
11

हमारा जावा प्रोग्राम लगातार एक फ़ाइल में कुछ महत्वपूर्ण डेटा लिखता है। अब जब भी फ़ाइल (जिस पर जावा प्रोग्राम लिख रहा है) कुछ मैन्युअल रूप से हटाए जाते हैं, तो हम कुछ अपवाद फेंकना चाहते हैं या कंसोल पर किसी प्रकार का त्रुटि संदेश प्रदर्शित करना चाहते हैं।जावा - फ़ाइल में लिखते समय फ़ाइल हटाने का पता कैसे लगाएं?

मैंने पाया कि जावा किसी भी अपवाद को फेंक नहीं देता है जब यह हटाए गए फ़ाइल को लिखने का प्रयास करता है।

विधि I - एक नया धागा शुरू करें जो जांच करेगा कि फ़ाइल वहां है या फ़ाइल हटा दिए जाने पर इसके बारे में मुख्य जावा प्रोग्राम को सूचित करें। यह हमारे मामले में काम नहीं करेगा क्योंकि हमारे पास कई फाइलें होंगी जिनमें जावा प्रोग्राम लिख रहा होगा ताकि प्रत्येक फ़ाइल के लिए एक नया धागा शुरू करने से स्मृति कुशल न हो।

विधि II - फ़ाइल में लिखने से पहले फ़ाइल के अस्तित्व की जांच करें। यह भी एक अच्छा दृष्टिकोण नहीं है क्योंकि फ़ाइल अस्तित्व की जांच करना एक महंगा ऑपरेशन है।

विधि तृतीय - बढ़ाएँ java.io.FilterWriter और लिखने() विधि अपवाद फेंक ओवरराइड (जिसे हम एक फ़ाइल पर लिखने में उपयोग कर रहे हैं) जब भी यह है कि कर दिया गया है एक फ़ाइल पर लिखने की कोशिश करता है नष्ट कर दिया। यह एक अच्छा समाधान प्रतीत होता है लेकिन मुझे कोई ऐसा स्थान नहीं मिला जहां जावा कुछ अपवाद पच रहा है (जब यह हटाए गए फाइल को लिखने का प्रयास करता है) जिसे हम उस विधि को ओवरराइड करके फेंक सकते हैं।

+0

क्या यह विंडोज या यूनिक्स है? क्या आप प्रत्येक लिखने के बाद फ़ाइल बंद कर रहे हैं, या पूरे समय आप इसे खोलने के बाद इसे खोल रहे हैं? – Gabe

+0

@Gabe यह यूनिक्स है। विंडोज़ में यदि आप कुछ प्रक्रियाओं द्वारा उपयोग किया जा रहा है तो आप फ़ाइल को हटा नहीं सकते हैं। –

+0

यूनिक्स में यह जानने का कोई तरीका नहीं है कि आपके द्वारा खोला गया फ़ाइल हटा दिया गया है, इसलिए जब ऐसा होता है तो जावा (या कोई अन्य भाषा) अपवाद फेंकने का कोई तरीका नहीं है। – Gabe

उत्तर

1

FileChannel और FileLock कक्षाएं इस मामले में सहायक हो सकती हैं।

How can I lock a file using java (if possible)

+0

लॉकिंग फ़ाइल को किसी भी तरह से लॉक करने से लॉक की गई फ़ाइल को हटाने से रोकता है? – Gabe

+1

@Gabe: ऐसा लगता है कि यूनिक्स/लिनक्स के तहत लॉकिंग केवल सलाहकार है और फ़ाइल को अन्य प्रक्रियाओं से हटाने से नहीं रोकती है। – splash

+0

कभी-कभी लॉकिंग अनिवार्य है (आप वास्तव में लॉक की गई फ़ाइल के उस हिस्से का उपयोग नहीं कर सकते हैं), लेकिन तब भी मुझे नहीं लगता कि यह आपको लॉक की गई फ़ाइल को हटाने से रोकता है। Java12 – Gabe

1

देख यूनिक्स के तहत, वहाँ फ़ाइलें हैं और वहाँ निर्देशिका हैं। एक फ़ाइल जितनी चाहें उतनी निर्देशिका में दिखाई दे सकती है, और एक खुली फ़ाइल डिस्क पर हो सकती है लेकिन किसी भी निर्देशिका में दिखाई नहीं दे सकती है। अगर किसी निर्देशिका से फ़ाइल हटा दी जाती है जो निर्देशिका में परिवर्तन है, तो फ़ाइल नहीं।

यह निर्धारित करने के लिए कि निर्देशिका बदल गई है या नहीं, आपको File.exists() के साथ अपना पथ मतदान करना होगा। जावा 7 में एक निर्देशिका वॉचर है जो मतदान की आवश्यकता से बच सकता है।

+1

+1 ... स्प्लैश की आप किस टिप्पणी के बारे में बात कर रहे हैं? –

1

सबसे पहले, मुझे संदेह है कि अगर आप एक लापता फाइल को लिखने का प्रयास करते हैं तो जावा अपवाद नहीं फेंक देगा। http://commons.apache.org/proper/commons-io/apidocs/org/apache/commons/io/monitor/package-summary.html मूल रूप से, आप कर सकते हैं: क्या हो सकता है कि यूनिक्स के तहत फ़ाइल उपयोगकर्ता द्वारा हटा दिया जाता है लेकिन इस प्रक्रिया अभी भी एक बैकअप फ़ाइल (स्वयं की प्रतिलिपि)

को लिखते फ़ाइल की निगरानी पैकेज कब Apache Commons पर एक नजर डालें है विभिन्न घटनाओं के लिए श्रोताओं को पंजीकृत करें (फ़ाइल हटाएं, निर्देशिका हटाएं, आदि) और श्रोता।

यदि आप हटाने को रोकना चाहते हैं तो मैं @ स्प्लैश की टिप्पणी पर विचार करूंगा। एक और विकल्प एक छिपी हुई फाइल को अपनी खुद की एक अस्थायी निर्देशिका में लिखना है।

+0

+1 में DirectoryWatcher का उल्लेख करने के लिए –

+0

फ़ाइल लॉक वाला वाला एक – peshkira

-1
  1. यूनिक्स, लिनक्स, सोलारिस, MacOS, एचपी/UX, AIX, आदि में, वहाँ का पता लगाने के है कि एक खुले फ़ाइल हटा दिया गया है कोई संभव तरीका है।

  2. विंडोज़ में एक खुली फ़ाइल को हटाना असंभव है।

तो आपके प्रश्न का कोई स्पष्ट जवाब नहीं है।