टिम ब्रै के लेख "Saving Data Safely" में खुले प्रश्नों के साथ मुझे छोड़ दिया गया ext4/fsync स्थिति अस्पष्ट है। आज, यह एक महीने से अधिक पुराना है और मैंने इस पर कोई फॉलो-अप नहीं देखा है, इसलिए मैंने यहां विषय को संबोधित करने का फैसला किया।एंड्रॉइड (जावा)
लेख का एक बिंदु यह है कि FileOutputStream का उपयोग करते समय FileDescriptor.sync() को सुरक्षित पक्ष पर कॉल किया जाना चाहिए। सबसे पहले, मैं बहुत चिंतित था, क्योंकि मैंने जावा के 12 साल के दौरान कोई भी जावा कोड सिंक नहीं किया है। खासकर फाइलों के साथ मुकाबला करने के बाद एक सुंदर मूल बात है। साथ ही, FileOutputStream के मानक JavaDoc को समन्वयित करने पर संकेत नहीं दिया गया (जावा 1.0 - 6)। कुछ शोध के बाद, मुझे लगा कि ext4 वास्तव में पहली मुख्यधारा फ़ाइल प्रणाली हो सकती है जो समन्वयन की आवश्यकता है। (वहाँ अन्य फ़ाइल सिस्टम जहां स्पष्ट सिंक्रनाइज़ सलाह दी जाती है क्या?)
मैं इस मामले पर कुछ सामान्य विचार की सराहना करते हैं, लेकिन मैं भी कुछ विशिष्ट प्रश्न हैं:
- जब एंड्रॉयड फाइल सिस्टम के लिए सिंक करना होगा ? यह आवधिक और अतिरिक्त रूप से जीवन चक्र घटनाओं के आधार पर हो सकता है (उदाहरण के लिए एक ऐप की प्रक्रिया पृष्ठभूमि में जाती है)।
- क्या FileDescriptor.sync() मेटा डेटा को सिंक करने का ख्याल रखता है? वह बदली गई फाइल की निर्देशिका को सिंक कर रहा है। FileChannel.force() से तुलना करें।
- आमतौर पर, कोई फ़ाइलऑटपुटस्ट्रीम में सीधे नहीं लिखता है। यहाँ मेरी समाधान है (आप सहमत हैं?):
FileOutputStream fileOut = ctx.openFileOutput(file, Context.MODE_PRIVATE); BufferedOutputStream out = new BufferedOutputStream(fileOut); try { out.write(something); out.flush(); fileOut.getFD().sync(); } finally { out.close(); }
मुझे यह सुनिश्चित करने के लिए फ्लश() की उम्मीद होगी कि डिस्क पर सब कुछ लिखा गया है - अनिवार्य रूप से सिंक() को कॉल करके। क्या यह मामला नहीं है? –
@a_horse_with_no_name: नहीं, यह नहीं है। _flush_ और _sync_ दो अलग-अलग ऑपरेशन हैं: फ्लश बस इंटरमीडिएट बफर फ्लश करता है; सिंक वास्तव में भंडारण के लिए लिखता है। उदाहरण देखें http://stackoverflow.com/questions/2340610/difference-between-fflush-and-fsync – sleske
@sleske: स्पष्टीकरण के लिए धन्यवाद! –