Android में अस्थायी फ़ाइलें बनाना


204

Android में एक अस्थायी फ़ाइल बनाने का सबसे अच्छा तरीका क्या है?

क्या File.createTempFile का उपयोग किया जा सकता है? प्रलेखन इसके बारे में बहुत अस्पष्ट है।

विशेष रूप से, यह स्पष्ट नहीं है कि कब बनाई गई अस्थायी फ़ाइलें File.createTempFileहटा दी जाती हैं, यदि कभी।


आप स्टैकओवरफ़्लो में इस थ्रेड से शुरू कर सकते हैं , जहां अस्थायी-फाइलों पर चर्चा की जाती है।
बेनी स्कोबर्गबर्ग

: इस Android डेवलपर Google समूह चर्चा रुचिकर हो सकती groups.google.com/group/android-developers/browse_thread/thread/...
hpique

जवाबों:


286

यह वही है जो मैं आमतौर पर करता हूं:

File outputDir = context.getCacheDir(); // context being the Activity pointer
File outputFile = File.createTempFile("prefix", "extension", outputDir);

उनके विलोपन के लिए, मुझे पूरा यकीन नहीं है। जब से मैं अपने कैश के कार्यान्वयन में इसका उपयोग करता हूं, तब तक मैं मैन्युअल रूप से सबसे पुरानी फाइलों को हटा देता हूं जब तक कि कैश डायरेक्टरी का आकार मेरे पूर्व निर्धारित मूल्य पर नहीं आ जाता।


2
यही मैं भी करता हूं। मेरी धारणा यह है कि createTempFile वास्तविक अस्थायी फ़ाइलों का निर्माण नहीं करता है जब तक कि यह कैश डायर का उपयोग नहीं करता है, लेकिन यह वास्तव में प्रलेखित नहीं है।
hpique

क्या मैं मान सकता हूं कि जब तक ऐप चल रहा है, तब तक फ़ाइल बनी रहेगी, भले ही अन्य ऐप भी चलें और अपनी अस्थायी फ़ाइलें बनाएं?
Android डेवलपर

1
प्रत्येक ऐप इसका उपयोग स्वयं कैश करता है: डिफ़ॉल्ट रूप से, आंतरिक संग्रहण में सहेजी गई फाइलें आपके एप्लिकेशन के लिए निजी हैं और अन्य एप्लिकेशन उन्हें एक्सेस नहीं कर सकते हैं (न ही उपयोगकर्ता कर सकते हैं)। यदि आप कुछ डेटा को कैश करना चाहते हैं, तो आपको एक फ़ाइल खोलने के लिए getCacheDir () का उपयोग करना चाहिए, जहां आपके एप्लिकेशन को अस्थायी कैश फ़ाइलों को सहेजना चाहिए। जब डिवाइस आंतरिक संग्रहण स्थान पर कम होता है, तो एंड्रॉइड अंतरिक्ष को पुनर्प्राप्त करने के लिए इन कैश फ़ाइलों को हटा सकता है। हालाँकि, आपको इन फ़ाइलों को साफ़ करने के लिए सिस्टम पर निर्भर नहीं होना चाहिए। स्रोत
felixd

क्या मैं इस फ़ाइल को साझा करने के लिए साझा इरादे का उपयोग कर सकता हूं?
अक् स स।

4
आप outputFile.deleteOnExit () कॉल कर सकते हैं। सिद्धांत रूप में, सिस्टम आपके ऐप से बाहर निकलने पर इसे साफ कर देगा। फ़ाइल वर्ग में मानक विधि।
डेव हबर्ड

90

आंतरिक और बाहरी अस्थायी फ़ाइलों पर सर्वोत्तम अभ्यास :

आंतरिक कैश

यदि आप कुछ डेटा को कैश करना चाहते हैं, तो इसे लगातार स्टोर करने के बजाय, आपको getCacheDir()एक फ़ाइल खोलने के लिए उपयोग करना चाहिए जो आंतरिक निर्देशिका का प्रतिनिधित्व करता है जहां आपके एप्लिकेशन को अस्थायी कैश फ़ाइलों को सहेजना चाहिए।

जब डिवाइस आंतरिक संग्रहण स्थान पर कम होता है, तो एंड्रॉइड अंतरिक्ष को पुनर्प्राप्त करने के लिए इन कैश फ़ाइलों को हटा सकता है। हालाँकि, आपको इन फ़ाइलों को साफ़ करने के लिए सिस्टम पर निर्भर नहीं होना चाहिए। आपको हमेशा कैश फ़ाइलों को स्वयं बनाए रखना चाहिए और 1MB जैसे उपभोग किए गए स्थान की उचित सीमा के भीतर रहना चाहिए। जब उपयोगकर्ता आपके एप्लिकेशन को अनइंस्टॉल करता है, तो ये फाइलें हटा दी जाती हैं।

बाहरी कैश

बाह्य संग्रहण निर्देशिका का प्रतिनिधित्व करने वाली फ़ाइल को खोलने के लिए जहां आपको कैशे फ़ाइलों को सहेजना चाहिए, कॉल करें getExternalCacheDir()। यदि उपयोगकर्ता आपके एप्लिकेशन को अनइंस्टॉल करता है, तो ये फाइलें अपने आप डिलीट हो जाएंगी।

ContextCompat.getExternalFilesDirs()उपरोक्त के समान , आप कॉल करके भी द्वितीयक बाह्य संग्रहण (यदि उपलब्ध हो) पर कैशे डायरेक्टरी का उपयोग कर सकते हैं ContextCompat.getExternalCacheDirs()

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


2
यह बड़ी अस्थायी फ़ाइलों के साथ क्या करना है, इस सवाल का पर्याप्त रूप से जवाब नहीं देता है। यहां सबसे अच्छा अभ्यास क्या है? मुझे संदेह है कि एक सामान्य फ़ाइल को प्रबंधित करने के अलावा कोई अन्य नहीं है।
मर्क

35

अस्थायी आंतरिक फ़ाइलों के लिए उनके 2 विकल्प हैं

1।

File file; 
file = File.createTempFile(filename, null, this.getCacheDir());

2।

File file
file = new File(this.getCacheDir(), filename);

दोनों विकल्प अनुप्रयोगों को कैश डायरेक्टरी में फाइल जोड़ते हैं और इस प्रकार आवश्यकता के अनुसार जगह बनाने के लिए साफ़ किया जा सकता है लेकिन विकल्प 1 फ़ाइल के अद्वितीय रखने के लिए फ़ाइल नाम के अंत में एक यादृच्छिक संख्या जोड़ देगा। यह एक फ़ाइल एक्सटेंशन भी जोड़ देगा जो .tmpडिफ़ॉल्ट रूप से है, लेकिन इसे 2 पैरामीटर के उपयोग के माध्यम से कुछ भी सेट किया जा सकता है। यादृच्छिक संख्या के उपयोग का अर्थ है एक फ़ाइल नाम निर्दिष्ट करने के बावजूद यह उसी तरह नहीं रहता है जैसे संख्या प्रत्यय / फ़ाइल एक्सटेंशन ( .tmpडिफ़ॉल्ट रूप से) के साथ जोड़ा जाता है जैसे आप अपना फ़ाइल नाम निर्दिष्ट करते हैं internal_fileऔर जैसे ही बाहर आता है internal_file1456345.tmp। आप एक्सटेंशन को निर्दिष्ट कर सकते हैं, जबकि आप उस संख्या को निर्दिष्ट नहीं कर सकते हैं जो जोड़ी गई है। हालाँकि आप इसके द्वारा उत्पन्न फ़ाइल नाम पा सकते हैंfile.getName();, लेकिन आपको इसे कहीं स्टोर करने की आवश्यकता होगी ताकि आप इसका उपयोग तब कर सकें जब आप उदाहरण के लिए फ़ाइल को हटाना या पढ़ना चाहते थे। इसलिए इस कारण से मैं दूसरा विकल्प पसंद करता हूं क्योंकि आपके द्वारा निर्दिष्ट फ़ाइल नाम जो बनाया गया है।


2
क्या मैं यह मान सकता हूं कि ऐप की प्रक्रिया जीवित नहीं होने पर अस्थायी फ़ाइलें केवल हटा दी जाएंगी?
Android डेवलपर

2

@GuilhermeBernal आप यह कैसे जानते हैं? क्या आपने इसे नष्ट होते देखा है?
Android डेवलपर

1
@androiddeveloper पहले विवरण नहीं देने के लिए क्षमा करें। एक उपयोगकर्ता एप्लिकेशन को खोल सकता है, फिर सेटिंग्स में जा सकता है, अपना कैश साफ़ कर सकता है और फिर ऐप पर वापस जा सकता है, सभी इसे मारे बिना। तो कोई ऐप यह नहीं मान सकता है कि कैश फ़ाइल को हटाया नहीं जाएगा और कुछ भी नहीं रोकता है एंड्रॉइड खुद को उपयोगकर्ता के इंटरैक्शन के बिना ऐसा करने से रोकता है।
गुइलहर्मे बर्नल

14

आप संदर्भ dgetCacheDir () का उपयोग करके कैश डायर का उपयोग कर सकते हैं ।

File temp=File.createTempFile("prefix","suffix",context.getCacheDir());

10
फ़ाइल अस्थायी = File.createTempFile ("उपसर्ग", "प्रत्यय", संदर्भ.गेट कैचीडिर ());
पैट्रिक

धन्यवाद, मैंने यह किया, लेकिन मेरी फ़ाइल का आकार 0B के बराबर है, जहां समस्या है, कोई विचार?
user7856586

0

आप File.deleteOnExit()विधि का उपयोग कर सकते हैं

https://developer.android.com/reference/java/io/File.html#deleteOnExit ()

यह यहाँ संदर्भित है https://developer.android.com/reference/java/io/File.html#createTempFile(java.lang.String , java.lang.String, java.io.File)


7
यह JVM के अजीब स्वाद के कारण एंड्रॉइड पर बहुत बेकार है (यह लगभग कभी भी सामान्य रूप से समाप्त नहीं होता है)
कमजोर पक्ष

1
जब तक कोई प्रदर्शन चिंता नहीं हो, तब तक डेटा को तुरंत डिलीट, फ्री या ड्रॉप करें, जब आपको इसकी आवश्यकता न हो।
Redwolf

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.