खोज…


परिचय

एंड्रॉइड में फ़ाइलों को पढ़ना और लिखना मानक जावा में फाइलों को पढ़ने और लिखने से अलग नहीं है। एक ही java.io पैकेज का उपयोग किया जा सकता है। हालाँकि, फ़ोल्डर से संबंधित कुछ विशिष्ट हैं जहाँ आपको लिखने की अनुमति है, सामान्य रूप से अनुमतियाँ और एमटीपी के आसपास काम करते हैं।

टिप्पणियों

Android यहाँ दस्तावेज़ के रूप में कई अनुप्रयोगों के बीच फ़ाइल साझा करने के लिए साधन प्रदान करता है। यह आवश्यक नहीं है यदि केवल एक ऐप है जो फ़ाइल बनाता है और उसका उपयोग करता है।

एंड्रॉइड साझा और निजी प्राथमिकताओं, सहेजे गए बंडल और अंतर्निहित डेटाबेस जैसे वैकल्पिक भंडारण विकल्प प्रदान करता है। कुछ मामलों में, वे केवल सादे फ़ाइलों का उपयोग करने से बेहतर विकल्प हैं।

एंड्रॉइड गतिविधि में कुछ विशिष्ट तरीके हैं जो जावा मानक फ़ाइल IO विधियों के प्रतिस्थापन की तरह दिखते हैं। उदाहरण के लिए, के लिए बजाय File.delete() आप कॉल कर सकते हैं Context.deleteFile() , और बदले लागू करने की File.listFiles() रिकर्सिवली आप कॉल कर सकते हैं Context.fileList() कुछ हद तक कम के साथ सभी अपने अनुप्रयोग विशिष्ट फ़ाइलों की सूची प्राप्त करने कोड। हालांकि, वे मानक java.io पैकेज से परे अतिरिक्त कार्यक्षमता प्रदान नहीं करते हैं।

काम करने वाले फोल्डर को प्राप्त करना

आप अपनी गतिविधि पर विधि getFilesDir() को कॉल करके अपना कार्यशील फ़ोल्डर प्राप्त कर सकते हैं (गतिविधि आपके आवेदन में केंद्रीय वर्ग है जो संदर्भ से विरासत में मिली है। यहां देखें)। पढ़ना अलग नहीं है। केवल आपके एप्लिकेशन के पास इस फ़ोल्डर तक पहुंच होगी।

आपकी गतिविधि में निम्न कोड हो सकते हैं, उदाहरण के लिए:

  File myFolder = getFilesDir();
  File myFile = new File(myFolder, "myData.bin");

बाइट्स के कच्चे सरणी लेखन

  File myFile = new File(getFilesDir(), "myData.bin");
  FileOutputStream out = new FileOutputStream(myFile);

  // Write four bytes one two three four:
  out.write(new byte [] { 1, 2, 3, 4}
  out.close()

इस कोड के साथ Android विशिष्ट कुछ भी नहीं है। यदि आप अक्सर छोटे मान लिखते हैं, तो डिवाइस आंतरिक SSD के पहनने को कम करने के लिए BufferedOutputStream का उपयोग करें।

वस्तु को क्रमबद्ध करना

एंड्रॉइड में आपके लिए पुराना अच्छा जावा ऑब्जेक्ट सीरियललाइजेशन उपलब्ध है। आप इस तरह सीरियल श्रेणियों को परिभाषित कर सकते हैं:

  class Cirle implements Serializable {
    final int radius;
    final String name;

    Circle(int radius, int name) {
      this.radius = radius;
      this.name = name;
    }
  }

और फिर ObjectOutputStream पर लिखें:

  File myFile = new File(getFilesDir(), "myObjects.bin");
  FileOutputStream out = new FileOutputStream(myFile);
  ObjectOutputStream oout = new ObjectOutputStream(new BufferedOutputStream(out));

  oout.writeObject(new Circle(10, "One"));
  oout.writeObject(new Circle(12, "Two"));
  
  oout.close()

जावा ऑब्जेक्ट क्रमांकन या तो एकदम सही या वास्तव में बुरा विकल्प हो सकता है, जो इस पर निर्भर करता है कि आप इसके साथ क्या करना चाहते हैं - इस ट्यूटोरियल के दायरे से बाहर और कभी-कभी राय आधारित। यदि आप इसका उपयोग करने का निर्णय लेते हैं, तो पहले संस्करण के बारे में पढ़ें।

बाहरी भंडारण (एसडी कार्ड) के लिए लेखन

आप कई एंड्रॉइड डिवाइसों में मौजूद मेमोरी कार्ड (एसडी कार्ड) को / से पढ़ और लिख सकते हैं। इस स्थान की फ़ाइलें अन्य प्रोग्रामों द्वारा भी एक्सेस की जा सकती हैं, जो सीधे उपयोगकर्ता द्वारा पीसी को यूएसबी केबल के माध्यम से डिवाइस से कनेक्ट करने और एमटीपी प्रोटोकॉल को सक्षम करने के बाद होती हैं।

एसडी कार्ड स्थान ढूंढना कुछ अधिक समस्याग्रस्त है। पर्यावरण वर्ग में "बाहरी निर्देशिका" प्राप्त करने के लिए स्थैतिक विधियाँ शामिल हैं जो सामान्य रूप से एसडी कार्ड के अंदर होनी चाहिए, यह भी जानकारी हो कि एसडी कार्ड बिल्कुल मौजूद है और गलत है। इस प्रश्न में बहुमूल्य उत्तर हैं कि कैसे सुनिश्चित करें कि सही स्थान मिलेगा।

बाहरी संग्रहण तक पहुँचने के लिए आपको Android मेनिफ़ेस्ट की अनुमति चाहिए:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

एंड्रॉइड के पुराने संस्करणों को अनुमति देने के लिए इन अनुमतियों को प्रकट करने के लिए पर्याप्त है (उपयोगकर्ता को स्थापना के दौरान अनुमोदन करना होगा)। हालाँकि एंड्रॉइड 6.0 से शुरू होकर एंड्रॉइड पहले एक्सेस के समय उपयोगकर्ता से अनुमोदन के लिए कहता है, और आपको इस नए दृष्टिकोण का समर्थन करना चाहिए। अन्यथा आपके प्रकट होने की परवाह किए बिना पहुंच को अस्वीकार कर दिया जाता है।

एंड्रॉइड 6.0 में, पहले आपको अनुमति के लिए जांच करने की आवश्यकता है, फिर, यदि नहीं दी गई है, तो अनुरोध करें। कोड उदाहरण इस SO प्रश्न के अंदर मिल सकते हैं।

"अदृश्य एमटीपी फाइलें" समस्या का समाधान।

यदि आप MTP प्रोटोकॉल का उपयोग करके USB केबल से डेस्कटॉप के माध्यम से निर्यात करने के लिए फ़ाइलें बनाते हैं, तो एक समस्या हो सकती है कि नए बनाए गए फ़ाइल कनेक्टेड डेस्कटॉप पीसी पर चल रहे फ़ाइल एक्सप्लोरर में तुरंत दिखाई नहीं देते हैं। नई फ़ाइलों को दृश्यमान बनाने के लिए, आपको MediaScannerConnection को कॉल करना होगा :

File file = new File(Environment.getExternalStoragePublicDirectory(
        Environment.DIRECTORY_DOCUMENTS), "theDocument.txt");
FileOutputStream out = new FileOutputStream(file)

... (write the document)

out.close()
MediaScannerConnection.scanFile(this, new String[] {file.getPath()}, null, null);
    context.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE,
            Uri.fromFile(file)));

यह MediaScannerConnection कॉल कोड केवल फाइलों के लिए काम करता है, निर्देशिकाओं के लिए नहीं। इस Android बग रिपोर्ट में समस्या का वर्णन किया गया है। यह भविष्य में कुछ संस्करण के लिए, या कुछ उपकरणों पर तय किया जा सकता है।

बड़ी फाइलों के साथ काम करना

छोटी फ़ाइलों को दूसरे के एक हिस्से में संसाधित किया जाता है और आप उन्हें कोड के स्थान पर पढ़ / लिख सकते हैं जहाँ आपको इसकी आवश्यकता होती है। हालाँकि, यदि फ़ाइल बड़ी या अन्यथा धीमी है, तो आपको पृष्ठभूमि में फ़ाइल के साथ काम करने के लिए Android में AsyncTask का उपयोग करना पड़ सकता है:

    class FileOperation extends AsyncTask<String, Void, File> {

        @Override
        protected File doInBackground(String... params) {
          try {
            File file = new File(Environment.getExternalStoragePublicDirectory(
            Environment.DIRECTORY_DOCUMENTS), "bigAndComplexDocument.odf");
            FileOutputStream out = new FileOutputStream(file)

           ... (write the document)

            out.close()
            return file;
            } catch (IOException ex) {
               Log.e("Unable to write", ex);
               return null;
              }
        }

        @Override
        protected void onPostExecute(File result) {
          // This is called when we finish 
        }

        @Override
        protected void onPreExecute() {
           // This is called before we begin
        }

        @Override
        protected void onProgressUpdate(Void... values) {
            // Unlikely required for this example
        }
    }
}

और फिर

new FileOperation().execute("Some parameters");    

इस SO प्रश्न में AsyncTask बनाने और कॉल करने का पूरा उदाहरण है। IOException और अन्य त्रुटियों को कैसे संभालना है, इस पर सवाल को भी देखें।



Modified text is an extract of the original Stack Overflow Documentation
के तहत लाइसेंस प्राप्त है CC BY-SA 3.0
से संबद्ध नहीं है Stack Overflow