/ Res और / संपत्ति निर्देशिकाओं के बीच अंतर


266

मुझे पता है कि resनिर्देशिका में फाइलें सुलभ हैं R.classजबकि संपत्ति एक फाइल सिस्टम की तरह व्यवहार करती है, लेकिन मैं सामान्य रूप से जानना चाहूंगा, जब एक और दूसरे का उपयोग करना सबसे अच्छा है।
क्या कोई मुझे रेस और संपत्ति के बीच वास्तविक अंतर जानने में मदद कर सकता है?

जवाबों:


284

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

तो क्यों एक संपत्ति फ़ोल्डर बिल्कुल है? यदि आप उस परिसंपत्ति की गणना करना चाहते हैं जिसे आप रन टाइम में उपयोग करना चाहते हैं, तो यह बहुत आसान है। संसाधनों के साथ, आपको उन सभी संसाधन आईडी की सूची घोषित करनी होगी, जिनका उपयोग किया जा सकता है और सूची में एक सूचकांक की गणना कर सकते हैं। (यह अजीब तरह का है और विकास चक्र में संसाधनों का सेट बदलने पर त्रुटि के अवसरों का परिचय getIdentifierदेता है।) एक फ़ोल्डर पदानुक्रम में भी व्यवस्थित किया जाना चाहिए, जो संसाधनों द्वारा समर्थित नहीं है। यह डेटा के प्रबंधन का एक अलग तरीका है। हालाँकि संसाधन अधिकांश मामलों को कवर करते हैं, लेकिन परिसंपत्तियों का कभी-कभार उपयोग होता है।

एक अन्य अंतर: लाइब्रेरी प्रोजेक्ट में परिभाषित संसाधन स्वचालित रूप से उन एप्लिकेशन प्रोजेक्ट्स पर आयात किए जाते हैं जो लाइब्रेरी पर निर्भर करते हैं। संपत्ति के लिए, ऐसा नहीं होता है; एसेट फाइलें एप्लिकेशन प्रोजेक्ट (एस) की एसेट्स डायरेक्टरी में मौजूद होनी चाहिए। [EDIT: एंड्रॉइड के नए ग्रेडल-आधारित बिल्ड सिस्टम (एंड्रॉइड स्टूडियो के साथ उपयोग किया गया) के साथ, यह अब सच नहीं है। पुस्तकालय परियोजनाओं के लिए एसेट निर्देशिकाओं को .AR फ़ाइलों में पैक किया जाता है, इसलिए पुस्तकालय परियोजनाओं में परिभाषित संपत्ति को आवेदन परियोजनाओं में मिला दिया जाता है (इसलिए /assetsयदि वे संदर्भित पुस्तकालय में हैं तो उन्हें आवेदन की निर्देशिका में मौजूद नहीं होना चाहिए ]]

संपादित करें: यदि आप अपने ऐप के साथ कस्टम फ़ॉन्ट पैकेज करना चाहते हैं, तो एक और अंतर पैदा होता है। फ़ाइल सिस्टम या आपके ऐप की निर्देशिका में संग्रहीत फ़ॉन्ट फ़ाइल से बनाने के लिए एपीआई कॉल हैं । लेकिन निर्देशिका में संग्रहीत फ़ॉन्ट फ़ाइल (या , जो निर्देशिका के उपयोग की अनुमति होगी ) से बनाने के लिए कोई एपीआई नहीं है । [ नोट: एंड्रॉइड ओ (अब अल्फा पूर्वावलोकन में उपलब्ध है) के साथ आप कस्टम फोंट को संसाधनों के रूप में शामिल करने में सक्षम होंगे। इस लंबे समय से अतिदेय सुविधा का वर्णन यहाँ देखें । हालाँकि, जब तक आपका न्यूनतम एपीआई स्तर 25 या उससे कम है, आपको संसाधनों के बजाय संपत्ति के रूप में पैकेजिंग कस्टम फोंट के साथ रहना होगा।]Typefaceassets/Typefaceres/InputStreamres/


1
resसंसाधनों के लिए खड़ा है, तो क्या assetsखड़ा है ??
विवेक वार्डे

40
@vwvwvwvwvwvwvwvwvw - उम ... यह "कुछ भी" के लिए खड़ा नहीं है; इसका सीधा अर्थ है "संपत्ति" (अंग्रेजी शब्द संपत्ति के बहुवचन में : एक उपयोगी या मूल्यवान चीज )।
टेड होप

1
क्या raw/निर्देशिका में फ़ाइलों को लिखना संभव है ?
प्रिंस

6
@Prince - नहीं। /res'और' एसेट्स 'डाइरेक्टरी में सब कुछ केवल-पढ़ने के लिए है, क्योंकि वे .apk फ़ाइल में पैक किए गए हैं।
टेड होप

क्या हम संपत्ति फ़ोल्डर में एपीके फ़ाइल डाल सकते हैं और उपयोगकर्ता उस यूआई पर क्लिक करके उस एपीके को स्थापित कर सकते हैं?
विवेक मिश्रा

63

दोनों काफी समान हैं। दोनों के बीच वास्तविक मुख्य अंतर यह है कि resनिर्देशिका में प्रत्येक फ़ाइल को एक पूर्व-संकलित किया जाता है ID जिसे आसानी से एक्सेस किया जा सकता है R.id.[res id]। यह जल्दी और आसानी से छवियों, ध्वनियों, आइकन तक पहुंचने के लिए उपयोगी है ...

assetsनिर्देशिका अधिक एक फाइल सिस्टम की तरह है और तुम वहाँ में चाहते हैं किसी भी फाइल डाल करने के लिए और अधिक स्वतंत्रता प्रदान करता है। आप तब उस सिस्टम की प्रत्येक फाइल को एक्सेस कर सकते हैं जब आप जावा के माध्यम से किसी भी फाइल सिस्टम में किसी भी फाइल को एक्सेस कर रहे हों। यह निर्देशिका खेल विवरण, शब्दकोश, ... आदि जैसी चीजों के लिए अच्छा है। उम्मीद है की वो मदद करदे।


5
अगर हम अपने ऐप में external_fonts जोड़ना चाहते हैं तो हम उन्हें एसेट फोल्डर में डालते हैं।
तुषार पांडेय

1
@TusharPandey अब हमें Assetsफोल्डर को फोल्डर में रखने की जरूरत नहीं है , एंड्रॉइड सिस्टम में अब fontsडायरेक्टरी है और हम अपनी कस्टम फोंट फाइल को वहां रख सकते हैं या हमारे पास एंड्रॉइड स्टूडियो डाउनलोड कर सकते हैं।
CopsOnRoad

@ जेक, Oreo के लिए इसकी।
तुषार पांडे

1
@TusharPandey इसे Oreo में जोड़ा गया है, लेकिन इसे वापस Android समर्थन लाइब्रेरी में API स्तर 16 पर वापस भेज दिया गया है।
CopsOnRoad

36

मुझे पता है कि यह पुराना है, लेकिन इसे स्पष्ट करने के लिए, आधिकारिक Android प्रलेखन में प्रत्येक का स्पष्टीकरण है:

से http://developer.android.com/tools/projects/index.html

assets/

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

res/raw/

मनमानी कच्ची संपत्ति की फाइलों के लिए। संपत्ति / निर्देशिका के बजाय यहां परिसंपत्ति फ़ाइलों को सहेजना केवल उसी तरीके से भिन्न होता है, जिस तरह से आप उन्हें एक्सेस करते हैं। इन फ़ाइलों को aapt द्वारा संसाधित किया जाता है और R वर्ग में संसाधन पहचानकर्ता का उपयोग करके अनुप्रयोग से संदर्भित किया जाना चाहिए। उदाहरण के लिए, यह मीडिया के लिए एक अच्छी जगह है, जैसे कि MP3 या Ogg फाइलें।


4
मुझे लगता है कि यह वास्तव में इस मुद्दे को भ्रमित करता है - दोनों बनावट और ogg फाइलें डेटा के बड़े ग्लोब हैं जो आप एक यूजरलैंड एपीआई (ओपनजीएल / मीडियाप्लेयर) को खिलाते हैं ... वे यहां भेदभाव क्यों करेंगे?

9

कुछ मुख्य बिंदु निम्नलिखित हैं:

  1. कच्ची फाइलों में ऐसे नाम होने चाहिए जो वैध जावा पहचानकर्ता हों, जबकि एसेट्स में फाइलों का कोई स्थान और नाम प्रतिबंध नहीं है। दूसरे शब्दों में, हम जो भी निर्देशिका चाहते हैं, उन्हें समूहीकृत किया जा सकता है
  2. कच्ची फाइलें जावा से और साथ ही xml से संदर्भित करने के लिए आसान हैं (यानी आप प्रकट या अन्य xml फ़ाइल से कच्चे में एक फ़ाइल का उल्लेख कर सकते हैं)।
  3. परिसंपत्तियों / निर्देशिका के बजाय यहां परिसंपत्ति फ़ाइलों को सहेजना केवल उस तरीके से भिन्न होता है, जिसे आप उन्हें यहां http://developer.android.com/tools/projects/index.html पर दस्तावेज के रूप में एक्सेस करते हैं ।
  4. पुस्तकालय परियोजना में परिभाषित संसाधन स्वचालित रूप से उन अनुप्रयोगों परियोजनाओं के लिए आयात किए जाते हैं जो पुस्तकालय पर निर्भर करते हैं। संपत्ति के लिए, ऐसा नहीं होता है; एसेट फाइलें एप्लिकेशन प्रोजेक्ट की संपत्तियों की निर्देशिका में मौजूद होनी चाहिए
  5. एसेट्स डायरेक्टरी अधिक है जैसे कि एक फाइलसिस्टम किसी भी फाइल को वहां रखने के लिए अधिक स्वतंत्रता प्रदान करता है। आप तब उस सिस्टम की प्रत्येक फाइल को एक्सेस कर सकते हैं जब आप जावा के माध्यम से किसी भी फाइल सिस्टम में किसी भी फाइल को एक्सेस कर रहे हों। जैसे खेल डेटा फाइलें, फ़ॉन्ट्स, बनावट आदि।
  6. संसाधनों के विपरीत, आस्तियों को परिसंपत्ति निर्देशिका में सबफ़ोल्डर्स में व्यवस्थित किया जा सकता है हालांकि, केवल एक चीज जो आप किसी परिसंपत्ति के साथ कर सकते हैं वह है इनपुट स्ट्रीम। इस प्रकार, संपत्ति में अपने तार या बिटमैप को संग्रहीत करने के लिए बहुत अधिक समझ में नहीं आता है, लेकिन आप इनपुट-सुधार शब्दकोशों या गेम मैप जैसे कस्टम-प्रारूप डेटा संग्रहीत कर सकते हैं।
  7. Raw आपको अपनी R.java फाइल बनाकर एक कंपाइल टाइम चेक दे सकता है। यदि आप अपने डेटाबेस को निजी निर्देशिका में कॉपी करना चाहते हैं तो आप एसेट्स का उपयोग कर सकते हैं जो स्ट्रीमिंग के लिए बनाई गई हैं।

निष्कर्ष

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

स्वीकृत उत्तर के अनुसार, ग्रेड 4 बिल्ड सिस्टम का उपयोग करने वाली परियोजनाओं के लिए बिंदु 4 अब सही नहीं है; पुस्तकालयों की परिसंपत्तियों को आवेदन परियोजना के संपत्ति संग्रह में बांधा जाता है।
वेनरिक्स

4

यदि आपको उन्हें जावा कोड में कहीं और संदर्भित करने की आवश्यकता है, तो आप अपनी फ़ाइलों को "रिस" निर्देशिका में डाल देंगे।

और आरईएस फोल्डर की सभी फाइलों को आर फाइल में अनुक्रमित किया जाएगा, जो उन्हें लोड करने के लिए बहुत तेज (और बहुत आसान!) बनाता है।


6
आप जावा से संपत्ति में फ़ाइलों का उपयोग कर सकते हैं
हेइको रूप

2
हां, लेकिन वे अनुक्रमित नहीं हैं -> धीमी हो जाएगी, मोबाइल विकास में एक वास्तविक समस्या क्या है।
एल। बुत्ज़

हां, रेस / कच्चे और परिसंपत्ति के बीच क्या अंतर है? क्या Res / कच्चे को भी अनुक्रमित किया जाएगा?
एंटीकैफिक

@TedHopp से पोस्ट की जांच करें - वह उत्तर वास्तव में स्पष्ट लाता है।
एल। बुत्ज़

1

किसी भी प्रकार की फ़ाइलों को डंप करने के लिए एक फाइल सिस्टम की तरह संपत्ति का उपयोग करें। और res को स्टोर करने के लिए उपयोग करें, यह लेआउट, चित्र, मान के लिए बनाया गया है।


0

टेड होप ने इसका काफी बारीकी से जवाब दिया। मैं अपनी opengl बनावट और shader फ़ाइलों के लिए res / raw का उपयोग कर रहा हूं। मैं एक पदानुक्रमित संगठन प्रदान करने के लिए उन्हें एक संपत्ति निर्देशिका में ले जाने के बारे में सोच रहा था।

इस धागे ने मुझे विश्वास दिलाया कि नहीं। पहला, क्योंकि मुझे यूनीक रिसोर्स आईडी का उपयोग पसंद है। दूसरा क्योंकि फ़ाइल में पढ़ने के लिए InputStream / openRawResource या BitmapFactory का उपयोग करना बहुत सरल है। तीसरा क्योंकि यह एक पोर्टेबल लाइब्रेरी में उपयोग करने में सक्षम होने के लिए बहुत उपयोगी है।


1
इनपुटस्ट्रीम और बिटमैपफैक्टरी समर्थन के बिंदु 2, संसाधनों और परिसंपत्तियों (यहां देखें: stackoverflow.com/a/8501428/2441655 ) के लिए सही है। बिंदु 3 अब लागू नहीं होता है। (देखें स्वीकृत उत्तर)
वेनरिक्स

-5

एसेट्स आपके एप्लिकेशन में टेक्स्ट, xml, फोंट, संगीत और वीडियो जैसी मनमानी फ़ाइलों को शामिल करने का एक तरीका प्रदान करते हैं। यदि आप इन फ़ाइलों को "संसाधन" के रूप में शामिल करने का प्रयास करते हैं, तो एंड्रॉइड उन्हें अपने संसाधन सिस्टम में संसाधित करेगा और आप कच्चे डेटा को प्राप्त नहीं कर पाएंगे। यदि आप डेटा को अछूता एक्सेस करना चाहते हैं, तो एसेट्स इसे करने का एक तरीका है।


5
यह गलत है। यदि आप डेटा डालते हैं res/raw, तो आप कच्चे डेटा का उपयोग करके प्राप्त कर सकते हैं openRawResource(resourceName)
टेड हॉप

मेरे पास एक पुस्तकालय में बनावट और छायादार फाइलें हैं। मैं चाहिए res / उन्हें स्टोर करने के लिए कच्चे का उपयोग करें। मैं उन्हें पढ़ने के लिए InputStream और BitmapFactory का उपयोग करता हूं। मैं इसे एक स्वतंत्र टिप्पणी के रूप में जोड़ूंगा।
dturvene

Xamarin Microsoft डॉक्स से कॉपी किए गए लगता है। पाठ की प्रतिलिपि बनाते समय अपना स्रोत दें। docs.microsoft.com/en-us/xamarin/android/app-fundamentals/…
Sjoerd Pottuit
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.