2011-04-15 5 views
7

इसलिए मैंने फ़ाइल पर लॉक बनाने के लिए निम्न का उपयोग किया ताकि मैं इसे विशेष रूप से संपादित कर सकूं:जावा में, क्या फ़ाइल को पढ़ने के लिए कोई तरीका है जब उस फ़ाइल को अन्य थ्रेड द्वारा लॉक किया जाता है?

 File file = new File(filename); 
channel = new RandomAccessFile(file, "rw").getChannel(); 
lock = channel.tryLock(); 

अब मेरे पास एक दूसरा थ्रेड एक ही फ़ाइल तक पहुंचना चाहता है - बस पढ़ने के लिए, संपादित नहीं करें। मैं उसको कैसे करू? अभी दूसरा धागा एक आईओ अपवाद फेंक देगा और मुझे सूचित करेगा कि फ़ाइल लॉक है।

क्या यह करने योग्य है? कोई सुझाव? धन्यवाद

उत्तर

3

आप tryLock के तीन तर्क संस्करण का उपयोग कर एक साझा लॉक के लिए पूछ की कोशिश कर सकते।

यहाँ उचित जावाडोक है: http://download.oracle.com/javase/1.4.2/docs/api/java/nio/channels/FileChannel.html#tryLock%28long,%20long,%20boolean%29

मूल रूप से करने के बजाय कर lock=channel.tryLock() आप एक तरफ lock = channel.trylock(0, Long.MAX_VALUE, true)

एक के रूप में करना होगा, तो आप फ़ाइल जावा में ताला लगा के साथ सावधान रहना चाहिए। जबकि आप जेवीएम के भीतर अपेक्षित ताले व्यवहार की गारंटी दे सकते हैं, आप यह सुनिश्चित नहीं कर सकते कि वे कई प्रक्रियाओं में अपेक्षित व्यवहार करेंगे।

+0

thx मैं कोशिश करूंगा – neo

1

आम तौर पर एक फाइल लॉक करना ऑपरेटिंग सिस्टम के आधार पर होता है, और जब आप एक लिखना लॉक लेते हैं तो यह उस थ्रेड द्वारा अनन्य होता है जिसमें आप इसे लेते हैं। एक चीज जो आप कर सकते हैं, थ्रेड के बीच फ़ाइल ऑब्जेक्ट साझा करें (लेकिन रेसिंग की स्थिति से सावधान रहें)। File locking

1

शायद यह मदद करता है!

public abstract FileLock tryLock(long position, 
           long size, 
           boolean shared) 
         throws IOException 

प्रयास इस चैनल की फ़ाइल के दिए गए क्षेत्र पर एक ताला प्राप्त करने के लिए।

यह विधि अवरुद्ध नहीं है। एक आमंत्रण हमेशा तत्काल लौटाता है, या तो अनुरोधित क्षेत्र पर लॉक प्राप्त कर रहा है या ऐसा करने में विफल रहा है। यदि यह लॉक प्राप्त करने में विफल रहता है क्योंकि द्वारा एक ओवरलैपिंग लॉक आयोजित किया जाता है तो यह शून्य हो जाता है। यदि यह किसी भी अन्य कारण के लिए लॉक प्राप्त करने में विफल रहता है तो उपयुक्त अपवाद फेंक दिया जाता है।

स्थिति और आकार पैरामीटर द्वारा निर्दिष्ट क्षेत्र को वास्तविक अंतर्निहित फ़ाइल के भीतर निहित या ओवरलैप करने की आवश्यकता नहीं है। लॉक क्षेत्रों को आकार में तय किया गया है; यदि लॉक क्षेत्र में प्रारंभ में फ़ाइल का अंत होता है और फ़ाइल क्षेत्र से आगे बढ़ती है तो फ़ाइल का नया भाग लॉक द्वारा कवर नहीं किया जाएगा। एक फ़ाइल आकार में बढ़ने की आशा है और पूरी फ़ाइल पर एक ताला फिर एक क्षेत्र शून्य से शुरू, और फ़ाइल की उम्मीद अधिकतम आकार से अधिक नहीं छोटे आवश्यक है, बंद कर दिया जाना चाहिए। शून्य-तर्क tryLock() विधि आकार Long.MAX_VALUE आकार के क्षेत्र को लॉक करता है।

कुछ ऑपरेटिंग सिस्टम साझा ताले, जो मामले में एक साझा ताला के लिए एक अनुरोध स्वचालित रूप से एक विशेष लॉक के लिए एक अनुरोध में बदल जाता है का समर्थन नहीं करते। चाहे नव-अधिग्रहण लॉक साझा किया गया है या विशेष रूप से का आविष्कार करके परीक्षण किया जा सकता है जिसके परिणामस्वरूप लॉक ऑब्जेक्ट का विधि साझा किया गया है।

फ़ाइल लॉक पूरे जावा वर्चुअल मशीन की ओर से आयोजित किए जाते हैं। वे को उसी वर्चुअल मशीन के भीतर एकाधिक थ्रेड द्वारा फ़ाइल तक पहुंच के लिए उपयुक्त नहीं हैं।

पैरामीटर्स: स्थिति - जिस स्थिति पर लॉक किया गया क्षेत्र शुरू करना है; गैर-ऋणात्मक आकार होना चाहिए - लॉक क्षेत्र का आकार; गैर नकारात्मक होना चाहिए, और योग स्थिति + आकार गैर नकारात्मक साझा किया जाना चाहिए - एक अनन्य ताला रिटर्न अनुरोध करने के लिए, एक साझा ताला अनुरोध करने के लिए सही गलत: एक लॉक वस्तु नव हासिल कर ली ताला का प्रतिनिधित्व करने, या नल ताला हासिल नहीं किया जा सकता है अगर क्योंकि अन्य प्रोग्राम एक अतिव्यापी ताला फेंकता रखती है: IllegalArgumentException - मानकों के आधार पर पूर्व शर्त करते ClosedChannelException पकड़ नहीं है - इस चैनल OverlappingFileLockException बंद है, तो - एक ताला है कि अगर अनुरोधितओवरलैप करता हैक्षेत्र पहले से ही इस जावा आभासी मशीन द्वारा आयोजित किया जाता है, या अगर एक और धागा पहले से ही इस पद्धति में अवरुद्ध है और एक ही फाइल IOException के अतिव्यापी क्षेत्र लॉक करने के लिए प्रयास कर रहा है - कुछ अन्य आई/ओ त्रुटि आ जाती है देखें इसके अलावा: lock(), lock(long,long,boolean), tryLock()

संबंधित मुद्दे

 संबंधित मुद्दे