नाम से रेस / रॉ से फाइल कैसे पढ़ें


84

मैं फ़ोल्डर रेस / कच्चे / से एक फ़ाइल खोलना चाहता हूं । मुझे पूरा यकीन है कि फ़ाइल मौजूद है। मैंने कोशिश की फ़ाइल खोलने के लिए

File ddd = new File("res/raw/example.png");

आदेश

ddd.exists(); 

पैदावार FALSE । तो यह तरीका काम नहीं करता है।

कोशिश कर रहे हैं

MyContext.getAssets().open("example.png");

getMessage () "null" के साथ एक अपवाद को समाप्त करता है।

बस का उपयोग कर

R.raw.example

संभव नहीं है क्योंकि फ़ाइल नाम केवल एक स्ट्रिंग के रूप में रनटाइम के दौरान जाना जाता है।

फ़ोल्डर / रेस / रॉ / में फ़ाइल को एक्सेस करना इतना मुश्किल क्यों है?



इसे केवल रनटाइम पर एक स्ट्रिंग के रूप में क्यों जाना जाता है? क्या आप तार और आईडी के बीच एक मानचित्रण रख सकते हैं?
kabuko

डॉक्स पढ़ें: developer.android.com/guide/topics/resources/…
21

लिंक्स के लिए आपको धन्यवाद। मैं एक अलग उत्तर के रूप में एक सही समाधान दूंगा।
बर्नड

जवाबों:


150

दिए गए लिंक की मदद से मैं स्वयं समस्या को हल करने में सक्षम था। सही तरीका यह है कि आप संसाधन आईडी प्राप्त करें

getResources().getIdentifier("FILENAME_WITHOUT_EXTENSION",
                             "raw", getPackageName());

इसे InputStream के रूप में प्राप्त करने के लिए

InputStream ins = getResources().openRawResource(
            getResources().getIdentifier("FILENAME_WITHOUT_EXTENSION",
            "raw", getPackageName()));

16
बस स्पष्ट करने के लिए: Do नहीं पहले जोड़ें raw/फ़ाइल नाम के लिए। मान्य उदाहरण: के .getIdentifier("products","raw", getPackageName());लिएres/raw/products.json
JJD

4
जैसा कि JJD द्वारा कहा गया है, आपको FILENAME_WITHOUT_EXTENSION से पहले कच्चे / की आवश्यकता नहीं है। मैंने पाया कि यदि आप एक्सटेंशन का उपयोग करना चाहते हैं, उदाहरण के लिए मेरे पास दो फाइलें हैं abc.jpg और abc.zip, तो मैं उन दोनों को कच्चे फ़ोल्डर में abc_jpg और abc_zip के रूप में जोड़ दूंगा (कच्चे फ़ोल्डर में एक्सटेंशन की अनदेखी की जाती है), फिर स्ट्रिंग चर असाइन करें filename = abc.jpg या abc.zip, उसके बाद InputStream ins = getResources () का उपयोग करें। openRawResource (getResources ()। getIdentifier (filename.replace ("।", "_"), "raw", getPackageName ())); आशा है कि यह किसी की मदद करता है :)
ब्रूस

किसी भी स्ट्रीम को खोलने के लिए याद रखें
पियरे

मुझे फ़ाइलपथ की आवश्यकता है ... मैं इनपुटस्ट्रीम के बजाय इसे कैसे प्राप्त कर सकता हूं?
राफेल लीमा

44

यहाँ कच्चे फ़ोल्डर से XML फ़ाइल लेने का उदाहरण दिया गया है:

 InputStream XmlFileInputStream = getResources().openRawResource(R.raw.taskslists5items); // getting XML

तब आप कर सकते हो:

 String sxml = readTextFile(XmlFileInputStream);

कब:

 public String readTextFile(InputStream inputStream) {
        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();

        byte buf[] = new byte[1024];
        int len;
        try {
            while ((len = inputStream.read(buf)) != -1) {
                outputStream.write(buf, 0, len);
            }
            outputStream.close();
            inputStream.close();
        } catch (IOException e) {

        }
        return outputStream.toString();
    }

1
समस्या यह है कि मैं R.raw.XYZ का उपयोग नहीं कर सकता क्योंकि XYZ का नाम केवल एक स्ट्रिंग के रूप में उपलब्ध है। लेकिन सीमोन का लिंक समस्या को हल करने में मेरी मदद करता है। मैं एक अलग उत्तर के रूप में एक सही समाधान दूंगा।
बेरंड

3
यह पूरी तरह से ठीक काम करता हैInputStream input = Context.getResources().openRawResource(R.raw.configjson);
किसी ने

13

आप कच्चे / रिस का उपयोग करके फ़ाइलें पढ़ सकते हैं getResources().openRawResource(R.raw.myfilename)

लेकिन वहाँ एक आईडीई सीमा है कि आपके द्वारा उपयोग किए जाने वाले फ़ाइल नाम में केवल कम केस अल्फ़ान्यूमेरिक वर्ण और डॉट हो सकते हैं। तो आर में सूचीबद्ध XYZ.txtया my_data.binनहीं जैसे फ़ाइल नाम ।


9
अंडरस्कोर को संसाधन फ़ाइल नामों में भी अनुमति है
लालाटो

3
साथ ही संख्याओं की अनुमति है (पहले चरित्र के रूप में नहीं)।
फैंटमैक्सएक्स

पहले चरित्र के रूप में नहीं ... क्योंकि यह एक वैध जावा चर पहचानकर्ता नहीं होगा
peterchaula

1

यहाँ दो दृष्टिकोण हैं जो आप कोटलिन का उपयोग करके कच्चे संसाधनों को पढ़ सकते हैं।

संसाधन आईडी प्राप्त करके आप इसे प्राप्त कर सकते हैं। या, आप स्ट्रिंग पहचानकर्ता का उपयोग कर सकते हैं जिसमें आप प्रोग्राम को वृद्धिशीलता के साथ फ़ाइल नाम बदल सकते हैं।

चीयर्स मेट 🎉

// R.raw.data_post

this.context.resources.openRawResource(R.raw.data_post)
this.context.resources.getIdentifier("data_post", "raw", this.context.packageName)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.