2009-06-02 11 views
11

मेरे पास res/raw/ फ़ोल्डर में डेटाबेस फ़ाइल है। मैं R.raw.FileName के रूप में फ़ाइल नाम के साथ Resources.openRawResource() बुला रहा हूँ और मैं एक इनपुट स्ट्रीम प्राप्त है, लेकिन मैं इस उपकरण में एक एक और डेटाबेस फ़ाइल है, तो डिवाइस db मैं उपयोग करने के लिए है कि डाटाबेस की सामग्री की प्रतिलिपि करने के लिए:Resources.openRawResource() समस्या एंड्रॉइड

BufferedInputStream bi = new BufferedInputStream(is); 

और FileOutputStream, लेकिन मुझे एक अपवाद मिलता है कि डेटाबेस फ़ाइल दूषित हो गई है। मैं कैसे आगे बढ़ सकता हूं? मैं File और FileInputStream और /res/raw/fileName के रूप में पथ का उपयोग करके फ़ाइल को पढ़ने का प्रयास करता हूं, लेकिन यह भी काम नहीं करता है।

+0

किसी भी शरीर को एक ही समस्या का सामना करना पड़ा है क्योंकि मैंने openFileInput विधि का उपयोग किया है, लेकिन यह डिवाइस पथ को जांचता है न कि परियोजना पथ .... – Sam97305421562

उत्तर

36

हां, आप अपने कच्चे संसाधन फ़ोल्डर से डिवाइस पर एक बाइनरी कॉपी करने के लिए openRawResource का उपयोग करने में सक्षम होना चाहिए।

एपीआई डेमो (सामग्री/रीडएसेट) में उदाहरण कोड के आधार पर, आप डीबी फ़ाइल डेटा को पढ़ने के लिए निम्न कोड स्निपेट की विविधता का उपयोग करने में सक्षम होना चाहिए।

InputStream ins = getResources().openRawResource(R.raw.my_db_file); 
ByteArrayOutputStream outputStream=new ByteArrayOutputStream(); 
int size = 0; 
// Read the entire resource into a local byte buffer. 
byte[] buffer = new byte[1024]; 
while((size=ins.read(buffer,0,1024))>=0){ 
    outputStream.write(buffer,0,size); 
} 
ins.close(); 
buffer=outputStream.toByteArray(); 

आपकी फ़ाइल की एक प्रतिलिपि अब, buffer में मौजूद है ताकि आप एक नई फ़ाइल में बफर बचाने के लिए एक FileOutputStream उपयोग कर सकते हैं करना चाहिए।

FileOutputStream fos = new FileOutputStream("mycopy.db"); 
fos.write(buffer); 
fos.close(); 
0

InputStream.available गंभीर सीमाएँ हैं और स्ट्रीमिंग के लिए उपलब्ध सामग्री की लंबाई निर्धारित करने के लिए कभी नहीं किया जाना चाहिए।

http://developer.android.com/reference/java/io/FileInputStream.html#available(): "[...] बाइट्स की अनुमानित संख्या देता है जिसे अधिक इनपुट के लिए अवरुद्ध किए बिना पढ़ या छोड़ा जा सकता है। [...] ध्यान दें कि यह विधि इतनी कमजोर गारंटी प्रदान करती है कि यह है अभ्यास में बहुत उपयोगी नहीं है। "

आप 3 समाधान है: दो बार सामग्री के माध्यम से

  1. जाओ, पहले सिर्फ सामग्री की लंबाई की गणना करने, दूसरे वास्तव में डेटा को पढ़ने में
  2. एंड्रॉयड संसाधनों आप द्वारा तैयार किए गए हैं, डेवलपर, हार्डकोड अपने अपेक्षित लंबाई
  3. फ़ाइल को/संपत्ति निर्देशिका में रखें और इसे एसेटमैनेजर के माध्यम से पढ़ें जो आपको एसेटफाइलडिस्क्रिप्टर और इसकी सामग्री लंबाई विधियों तक पहुंच प्रदान करता है। हालांकि यह आपको लंबाई के लिए UNKNOWN मान दे सकता है, जो कि उपयोगी नहीं है।
+0

हाय, क्या यह अभी भी वैध है? – elect

+0

@ चयन करें एपीआई से हटाए गए गारंटी का उल्लेख किया गया है, लेकिन मैं अभी भी अभ्यास में विधि से बचूंगा। – TudorT

+0

ठीक है, और 3 के बारे में), यह 'अज्ञात' क्यों लौटा सकता है? – elect

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