2010-08-06 16 views
170

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

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

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

+0

इस Android डेवलपर Google समूह चर्चा ब्याज की हो सकती है : http://groups.google.com/group/android-developers/browse_thread/thread/b59af1a9940b87df?pli=1 – hpique

+0

आप [इस धागे] से शुरू कर सकते हैं (http://stackoverflow.com/questions/1431042/problem- इन-बिल्डिंग-अस्थायी-फ़ाइल-इन-एंड्रॉइड) स्टैक ओवरफ्लो में, जहां temp-files पर चर्चा की जाती है। –

उत्तर

223

यह है कि मैं क्या आम तौर पर करते हैं:

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

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

+1

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

+0

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

+0

प्रत्येक ऐप अपने स्वयं के कैश का उपयोग करता है: डिफ़ॉल्ट रूप से, आंतरिक संग्रहण में सहेजी गई फ़ाइलें आपके एप्लिकेशन के लिए निजी होती हैं और अन्य एप्लिकेशन उन्हें एक्सेस नहीं कर सकते हैं (न ही उपयोगकर्ता)। यदि आप कुछ डेटा कैश करना चाहते हैं, तो आपको फ़ाइल खोलने के लिए getCacheDir() का उपयोग करना चाहिए जहां आपके एप्लिकेशन को अस्थायी कैश फ़ाइलों को सहेजना चाहिए। जब डिवाइस आंतरिक संग्रहण स्थान पर कम होता है, तो एंड्रॉइड अंतरिक्ष को पुनर्प्राप्त करने के लिए इन कैश फ़ाइलों को हटा सकता है। हालांकि, आपको इन फ़ाइलों को साफ करने के लिए सिस्टम पर भरोसा नहीं करना चाहिए। [स्रोत] (http://developer.android.com/guide/topics/data/data-storage.html#filesInternal) – felixd

12

आप context.getCacheDir() का उपयोग कर कैश डीआईआर का उपयोग कर सकते हैं।

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

फ़ाइल temp = File.createTempFile ("उपसर्ग", "प्रत्यय", context.getCacheDir()); – Patrick

82

सर्वश्रेष्ठ व्यवहारों तथा external अस्थायी फ़ाइलें:

Internal Cache

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

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

External Cache

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

ContextCompat.getExternalFilesDirs() की तरह, जैसा कि ऊपर उल्लेख, आप भी ContextCompat.getExternalCacheDirs() को फोन करके एक माध्यमिक बाह्य भंडारण (यदि उपलब्ध हो) पर एक कैश निर्देशिका पहुँच सकते हैं।

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

+0

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

25

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

1.

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

2.

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

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

+1

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

+0

@androiddeveloper सं। –

+0

@ गुइलहेमबेर्नल आप कैसे जानते हैं? क्या आपने इसे हटा दिया है? –

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)

+4

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

+0

जब तक कोई प्रदर्शन चिंताएं, हटाएं, मुक्त या डेटा को तत्काल छोड़ दें, जब आपको इसकी आवश्यकता नहीं है। – Redwolf

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