2012-05-01 6 views
16

मैं संपत्ति फ़ोल्डर है कि मैं एक फ़ाइल वस्तु (InputStream में) में बदलने के लिए की जरूरत है एक पाठ फ़ाइल है।एंड्रॉइड: मैं संपत्ति फ़ाइल से फ़ाइल ऑब्जेक्ट कैसे बना सकता हूं?

String path = "file:///android_asset/datafile.txt"; 
URL url = new URL(path); 
File file = new File(url.toURI()); // Get exception here 

मैं बदल सकते हैं इस यह काम करने के लिए: जब मैं इस की कोशिश की, मैं "ऐसी कोई फ़ाइल" अपवाद मिल गया?

वैसे, मैं इन सबसे छुटकारा की कोशिश की करने के लिए अपने प्रोजेक्ट में कहीं और कोड का निम्न भाग संपत्ति फ़ोल्डर

public static Dialog doDialog(final Context context) { 
WebView wv = new WebView(context);  
wv.loadUrl("file:///android_asset/help/index.html"); 

मुझे लगता है कि मैं मानता कर में एक HTML फ़ाइल का संदर्भ देता है पर देख रहे हैं "उदाहरण के द्वारा कोड" उपरोक्त तंत्र को पूरी तरह से समझें नहीं, इसलिए यह संभव है कि मैं जो करने की कोशिश कर रहा हूं वह काम नहीं कर सकता है।

Thx!

+0

क्यों आप एक फ़ाइल वस्तु में इसे पढ़ने के लिए करना चाहते हैं? मेरा मानना ​​है कि आपको संपत्ति से डेटा को इनपुट इनपुट के रूप में पकड़ने की आवश्यकता है और उसे आउटपुटस्ट्रीम के रूप में लिखना है जो भौतिक स्थान को इंगित करता है। फिर आप इसे फ़ाइल ऑब्जेक्ट के रूप में खोल सकते हैं। http://stackoverflow.com/questions/4447477/android-how-to-copy-files-in-assets-to-sdcard – Gophermofur

+0

मैं संपदा फ़ाइल का प्रतियां बनाने से बचने के लिए कोशिश कर रहा हूँ, लेकिन मैं यह सब करता है, तो क्या करेंगे और विफल रहता है। कारण मैं एक फ़ाइल की जरूरत है कि यह एक ctor जिसका कोड मैं करने के लिए पहुँच नहीं है में एक तर्क के रूप में इस्तेमाल किया जाता है और यह है कि केवल ctor कि उस वर्ग के लिए मौजूद है। –

+0

आह, यह समझ में आता है। हो सकता है: प्रतिलिपि को एसडीकार्ड पर बनाएं, इसे कन्स्ट्रक्टर में पास करें और इसे पूरा करने के बाद इसे हटा दें? अगर फ़ाइल एक जैसी है और आप इसे हमेशा एसडीकार्ड पर उसी स्थान पर सहेजते हैं तो आप केवल 1 प्रतिलिपि बनाते हैं (यह पिछले संस्करण को ओवरराइट करेगा)। – Gophermofur

उत्तर

23

आप नहीं एक File वस्तु सीधे एक परिसंपत्ति से प्राप्त कर सकते हैं क्योंकि परिसंपत्ति एक फ़ाइल के रूप में संग्रहीत नहीं है। आपको संपत्ति को एक फ़ाइल में कॉपी करने की आवश्यकता होगी, फिर अपनी प्रतिलिपि पर File ऑब्जेक्ट प्राप्त करें।

+6

हां तो आप यह कैसे करते हैं? –

+0

@MarkMolina: अन्य उत्तर देखें। यह बहुत ज्यादा सिर्फ मानक जावा आई/ओ, 'खुला()' 'AssetManager', तो कॉपी करने आंकड़ों पर' InputStream' से एक 'OutputStream' करने के लिए अपने इच्छित फ़ाइल के लिए विधि से एक' InputStream' का उपयोग कर रहा है। – CommonsWare

8

आप नहीं एक परिसंपत्ति से सीधे एक फ़ाइल वस्तु प्राप्त कर सकते हैं।

पहले, उदाहरण AssetManager#open

के लिए उपयोग कर फिर InputStream कॉपी अपने संपत्ति से एक InputStream मिलती है:

public static void writeBytesToFile(InputStream is, File file) throws IOException{ 
    FileOutputStream fos = null; 
    try { 
     byte[] data = new byte[2048]; 
     int nbread = 0; 
     fos = new FileOutputStream(file); 
     while((nbread=is.read(data))>-1){ 
      fos.write(data,0,nbread);    
     } 
    } 
    catch (Exception ex) { 
     logger.error("Exception",ex); 
    } 
    finally{ 
     if (fos!=null){ 
      fos.close(); 
     } 
    } 
} 
0

इस समारोह कोड में गायब है। @wadali

private void copyFile(InputStream in, OutputStream out) throws IOException { 
    byte[] buffer = new byte[1024]; 
    int read; 
    while((read = in.read(buffer)) != -1){ 
     out.write(buffer, 0, read); 
    } 
} 

स्रोत: https://stackoverflow.com/a/4530294/4933464

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

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