भंडारण वह चीज है जिससे हम सभी वाकिफ हैं, लेकिन इसे हमेशा हल्के में लेते हैं। बहुत पहले नहीं, भंडारण क्षमता में हर छलांग वृद्धिशील थी और असंभव प्रतीत होती थी। आजकल, हम इस पर विचार करते समय दूसरा विचार नहीं करते हैं कि हमारे उपकरणों में इसका कितना हिस्सा है (और मतभेदों के बारे में कम परवाह नहीं कर सकते)।
स्मृति में संग्रहीत चीज़ों के विकास को देखना एक बड़ा बिंदु होगा। स्मार्टफोन से पहले, हमने कभी-कभार फोटो या दो, कुछ गेम और एक टन टेक्स्ट मैसेज सेव किए। लेकिन अब, किसी भी मानक फोन में एप्लिकेशन, दस्तावेज़, फ़ोटो, वीडियो, संगीत फ़ाइलें और बहुत कुछ होगा। आइए जानें कि हम अपने अनुप्रयोगों के लिए उपकरणों के भंडारण स्थान का उपयोग कैसे कर सकते हैं।
इस लेख में हम जो कवर करने जा रहे हैं वह है:
- Android फ़ोन पर विभिन्न प्रकार के संग्रहण
- भंडारण के प्रकारों के बीच अंतर
- अपने आवेदन में संग्रहण का उपयोग कैसे करें
प्रत्येक एप्लिकेशन के पास दो अलग-अलग प्रकार के संग्रहण तक पहुंच होती है:आंतरिक और बाहरी . इन दो प्रकार के भंडारण के बीच प्रमुख अंतर हैं, और उन्हें जानने से आपको अपना अगला एप्लिकेशन डिजाइन करते समय मदद मिलेगी।
शुरू करने से पहले, स्टोरेज और कैश के बारे में एक बात कहनी चाहिए। संग्रहण उन चीज़ों के लिए है जिन्हें आप लगातार सहेजना चाहते हैं, जबकि कैश अस्थायी रूप से चीज़ों को सहेजने के लिए है।
आंतरिक संग्रहण
जब प्रत्येक एप्लिकेशन ऑपरेटिंग सिस्टम पर चलता है, तो इसका अपना आंतरिक भंडारण होता है। यह संग्रहण निजी है और केवल एप्लिकेशन के उपयोग के लिए है। मतलब, अन्य एप्लिकेशन इसे एक्सेस नहीं कर सकते हैं और न ही उपयोगकर्ता कर सकते हैं। इंटरनल स्टोरेज का इस्तेमाल करते समय एक और बात का ध्यान रखें, वह है इसकी उपलब्धता। बाह्य संग्रहण के विपरीत, आंतरिक संग्रहण आपके एप्लिकेशन के लिए हमेशा उपलब्ध होता है।
हालाँकि, इस भंडारण के उपयोग में इसकी कमियाँ हैं। यदि उपयोगकर्ता एप्लिकेशन को हटा देता है, तो आपके ऐप के आंतरिक संग्रहण में संग्रहीत सभी डेटा को भी हटा दिया जाता है। कल्पना कीजिए कि क्या होगा यदि आप अपने फोन पर एक गेम इंस्टॉल करते हैं और सड़क के नीचे कहीं इसे हटाने का फैसला करते हैं। आप अपने खेल की प्रगति को सहेजना चाहते हैं, यदि किसी भी तरह से आप खेल को फिर से स्थापित करेंगे।
तो, हम किसी फ़ाइल को आंतरिक संग्रहण में कैसे सहेजते हैं?
public void saveFileInternalStorage() {
String FILENAME = "hello_world_file";
String inputToFile = "Hello From Internal Storage!";
try {
FileOutputStream fileOutputStream = openFileOutput(FILENAME, Context.MODE_PRIVATE);
fileOutputStream.write(inputToFile.getBytes());
fileOutputStream.close();
Toast.makeText(getApplicationContext(),
"File " + FILENAME + " has been saved successfully",
Toast.LENGTH_SHORT).show();
} catch (FileNotFoundException e) {
e.printStackTrace();
Toast.makeText(getApplicationContext(),
"File " + FILENAME + " has not been saved successfully due to an exception " + e.getLocalizedMessage(),
Toast.LENGTH_SHORT).show();
} catch (IOException e) {
e.printStackTrace();
Toast.makeText(getApplicationContext(),
"File " + FILENAME + " has not been saved successfully due to an exception " + e.getLocalizedMessage(),
Toast.LENGTH_SHORT).show();
}
}
जैसा कि आप कोड उदाहरण में देख सकते हैं, हम hello_world_file नामक फ़ाइल सहेज रहे हैं जिसमें टेक्स्ट शामिल है, “आंतरिक संग्रहण से नमस्ते!” . मैंने ऐसा करने का प्रयास करते समय होने वाले अपवादों को प्रदर्शित करने के लिए केवल दो कैच क्लॉज बनाए हैं, लेकिन आप उन्हें सामान्य अपवाद ऑब्जेक्ट के साथ एक कैच क्लॉज में छोटा कर सकते हैं।
ध्यान दें कि विधि openFileOutput यदि फ़ाइल पहले से मौजूद है, तो उसे खोलेगा, लेकिन यदि नहीं, तो उसे बना देगा। इस विधि का दूसरा पैरामीटर फ़ाइल मोड है। यह पैरामीटर फ़ाइल के दायरे और उस तक पहुंच को निर्दिष्ट करता है। डिफ़ॉल्ट मान MODE_PRIVATE है, जो फ़ाइल को केवल आपके एप्लिकेशन के लिए एक्सेस योग्य बनाता है।
इस पैरामीटर के लिए अन्य दो मान MODE_WORLD_READABLE और MODE_WORLD_WRITEABLE हैं, लेकिन उन्हें API 17 के बाद से हटा दिया गया है। निजी फ़ाइलों को अन्य अनुप्रयोगों के साथ साझा करना तर्क के एक अलग सेट का उपयोग करता है जिसके बारे में आप यहां अधिक पढ़ सकते हैं। अंत में, फ़ाइल में लिखते समय, हम अपनी स्ट्रिंग को बाइट्स में बदल देते हैं और हम फ़ाइल को अंत में बंद करना सुनिश्चित करते हैं।
बाहरी मेमोरी
नाम के अर्थ के विपरीत, यह भंडारण है जिसे इस तथ्य से परिभाषित किया जाता है कि यह हमेशा सुलभ नहीं होता है। इसका मतलब यह हो सकता है कि यह एक बाहरी एसडी कार्ड (सेकेंडरी एक्सटर्नल स्टोरेज) हो सकता है, लेकिन यह डिवाइस पर पाया जाने वाला स्टोरेज (प्राथमिक बाहरी स्टोरेज) भी हो सकता है।
तथ्य को घर लाने के लिए, बाहरी संग्रहण वह संग्रहण है जिसे तब एक्सेस किया जा सकता है जब आप अपने डिवाइस को USB केबल के माध्यम से कंप्यूटर से कनेक्ट करते हैं। जैसा कि आपने अनुमान लगाया होगा, इस प्रकार के संग्रहण में संग्रहीत कुछ भी आपके डिवाइस पर अन्य एप्लिकेशन के लिए पहुंच योग्य है, लेकिन यदि आप एप्लिकेशन की स्थापना रद्द करते हैं तो इसे रखा जाएगा।
इससे पहले कि हम यह प्रदर्शित कर सकें कि बाहरी संग्रहण में फ़ाइलों को कैसे सहेजना है, हमें दो काम करने होंगे:
- सुनिश्चित करें कि फ़ाइल को सहेजने के लिए पर्याप्त जगह है
- रनटाइम के दौरान अनुमति मांगें
यह सुनिश्चित करने के लिए कि पर्याप्त संग्रहण स्थान है, कोड की निम्नलिखित पंक्तियों की आवश्यकता है:
//Check if you can read/write to external storage
public boolean isExternalStorageWritable() {
String state = Environment.getExternalStorageState();
if (Environment.MEDIA_MOUNTED.equals(state)) {
return true;
}
return false;
}
बाह्य संग्रहण तक पहुंच प्राप्त करने के लिए, हमें अपने AndroidManifest.xml में निम्नलिखित अनुमति जोड़नी होगी:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
इसके अलावा, एपीआई 23 के बाद से, खतरनाक अनुमतियां इंस्टॉल समय के दौरान अधिकृत नहीं हैं, लेकिन रनटाइम के दौरान। बाह्य संग्रहण में लेखन को एक के रूप में वर्गीकृत किया गया है, इसलिए हमें तर्क जोड़ने की आवश्यकता है ताकि उपयोगकर्ता यह तय कर सके कि आवेदन की अनुमति दी जाए या नहीं।
public void saveFileExternalStorage(View view) {
if (isExternalStorageWritable()) {
if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) ==
PackageManager.PERMISSION_GRANTED) {
writeFileToExternalStorage();
} else{
ActivityCompat.requestPermissions(this,
new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 0);
}
}
}
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
switch (requestCode) {
case 0:
{
writeFileToExternalStorage();
break;
}
}
}
हमारा writeFileToExternalStorage ऐसा दिखता है:
public void writeFileToExternalStorage() {
String root = Environment.getExternalStorageDirectory().toString();
File myDir = new File(root + "/saved_files");
if (!myDir.exists()) {
myDir.mkdirs();
}
try {
File file = new File(myDir, "myfile.txt");
FileOutputStream out = new FileOutputStream(file);
out.write(inputToFile.getBytes());
out.close();
Toast.makeText(getApplicationContext(),
"File myfile.txt" + " has been saved successfully to external storage",
Toast.LENGTH_SHORT).show();
} catch (Exception e) {
e.printStackTrace();
}
}
यदि आप यहां प्रस्तुत सभी कोड का एक उदाहरण देखना चाहते हैं, तो आप इस GitHub रिपॉजिटरी पर जा सकते हैं।
जानना अच्छा है
आपके आवेदन के लिए विभिन्न प्रकार के भंडारण के साथ कैसे काम किया जाए, इसके सिर्फ दो सरल उदाहरण ऊपर दिए गए थे। चूंकि हम एक ऐसे संसाधन के साथ काम कर रहे हैं जिसे सिस्टम प्रबंधित करता है, हमें इससे जुड़े व्यवहारों के बारे में भी पता होना चाहिए।
डिफ़ॉल्ट रूप से, आपका एप्लिकेशन आंतरिक संग्रहण में स्थापित किया जाएगा (आंतरिक केवल स्पष्टीकरण देखें ), लेकिन एपीआई स्तर 8 से, आप एक विशेषता जोड़ सकते हैं, स्थान स्थापित करें , आपके मेनिफेस्ट में जो आपके एप्लिकेशन को बाहरी संग्रहण में इंस्टॉल करने देता है। ऐसा करने का एक कारण यह है कि यदि आपका एप्लिकेशन बहुत बड़ा है, और आप पसंद करेंगे कि उपयोगकर्ता इसे डिवाइस के बाहरी स्टोरेज पर इंस्टॉल करे क्योंकि वहां अधिक जगह है।
इस विशेषता के तीन मान हैं:
- स्वतः - इसका मतलब है कि आपके पास कोई विशिष्ट वरीयता नहीं है जहां एप्लिकेशन इंस्टॉल किया जाएगा। एप्लिकेशन आंतरिक संग्रहण में स्थापित करने का प्रयास करेगा, लेकिन यदि यह भरा हुआ है, तो यह इसे बाहरी संग्रहण के अंदर स्थापित कर देगा
- केवल आंतरिक - एप्लिकेशन केवल आंतरिक संग्रहण में स्थापित किया जाएगा, और यदि वहां पर्याप्त स्थान नहीं है, तो इसे इंस्टॉल नहीं किया जाएगा
- बाहरी को प्राथमिकता दें - इसका मतलब है कि आप चाहते हैं कि आपका एप्लिकेशन बाहरी स्टोरेज में इंस्टॉल हो, लेकिन अगर वहां पर्याप्त जगह नहीं है, तो इसे आंतरिक रूप से इंस्टॉल किया जाएगा
ऑटो और प्रेफर एक्सटर्नल दोनों विकल्पों के लिए, उपयोगकर्ता के पास एप्लिकेशन को बाहरी स्टोरेज से आंतरिक में स्थानांतरित करने का विकल्प होता है, और इसके विपरीत।
ध्यान रखें कि एक बार जब कोई उपयोगकर्ता अपने डिवाइस को कंप्यूटर से जोड़ता है और उसे डेटा साझा करने में सक्षम बनाता है या एसडी कार्ड को अनमाउंट करता है, तो बाहरी स्टोरेज से चलने वाले सभी एप्लिकेशन नष्ट हो जाते हैं। यदि आपका एप्लिकेशन निम्न सुविधाओं में से किसी एक का उपयोग करता है, तो आपको इसे बाहरी संग्रहण में स्थापित नहीं करना चाहिए:
विभिन्न सेवाएं (अलार्म सेवा s विशेष रूप से), इनपुट मेथड इंजन, लाइव वॉलपेपर, एप्लिकेशन विजेट, अकाउंट मैनेजर, सिंक एडेप्टर, डिवाइस एडमिनिस्ट्रेटर और ब्रॉडकास्ट रिसीवर बूट के लिए सुन रहे हैं।