2012-03-17 9 views
10

voglio solo creare un oggetto File come questoCome fare riferimento a un file nella cartella prima in Android

File myImageFile = new File ("image1") ;

ma mi sta dando eccezione di FileNotFoundException
Come posso fare riferimento a un depositare dentro la mia cartella prime

EDIT: In realtà volevo fare qualcosa di simile

MultipartEntity multipartEntity= new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE); multipartEntity.addPart("uploaded", new FileBody(new File("myimage")));

+0

e dove è la cartella le immagini? –

+0

@djaqeel Scusa cartella raw not images folder (che si trova all'interno della cartella res) .. anche io ho provato ad accedere alle immagini in una cartella drawable ma ottenere lo stesso errore –

+0

è davvero necessario come file, lo stream di input funziona per te? –

risposta

3

qui sono 2 funzioni. uno per leggere da RAW e uno dei Beni

/** 
* Method to read in a text file placed in the res/raw directory of the 
* application. The method reads in all lines of the file sequentially. 
*/ 

public static void readRaw(Context ctx,int res_id) { 

    InputStream is = ctx.getResources().openRawResource(res_id); 
    InputStreamReader isr = new InputStreamReader(is); 
    BufferedReader br = new BufferedReader(isr, 8192); // 2nd arg is buffer 
                 // size 

    // More efficient (less readable) implementation of above is the 
    // composite expression 
    /* 
    * BufferedReader br = new BufferedReader(new InputStreamReader(
    * this.getResources().openRawResource(R.raw.textfile)), 8192); 
    */ 

    try { 
     String test; 
     while (true) { 
      test = br.readLine(); 
      // readLine() returns null if no more lines in the file 
      if (test == null) 
       break; 
     } 
     isr.close(); 
     is.close(); 
     br.close(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

} 

e dalla cartella Assets

/** 
* Read a file from assets 
* 
* @return the string from assets 
*/ 

public static String getQuestions(Context ctx,String file_name) { 

    AssetManager assetManager = ctx.getAssets(); 
    ByteArrayOutputStream outputStream = null; 
    InputStream inputStream = null; 
    try { 
     inputStream = assetManager.open(file_name); 
     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) { 
     } 
    } catch (IOException e) { 
    } 
    return outputStream.toString(); 

} 
+0

Per quanto riguarda il metodo "readRaw", quando arriva alla fine del file, la variabile di test diventa nulla e quindi diventa inutile. – John61590

1

È possibile aprirlo come InputStream, non so, se possibile, come un file:

int rid = resources.getIdentifier(packageName + ":raw/" + fileName, null, null); 
//get the file as a stream 
InputStrea is = resources.openRawResource(rid); 
+0

se conosce il nome del file, usando "R.raw.id" è l'opzione migliore, direi. –

+0

@BorisStrandjev - Sono d'accordo, ma a volte le persone preferiscono farlo in quel modo. – MByD

+0

Ho letto in molti posti questo non è consigliabile: più difficile da codificare e con prestazioni molto peggiori. –

7

generale di accedere ai file attraverso getResources() openRawResource (R.id.. _la tua carta d'identità). Se avete assolutamente bisogno di un riferimento ad esso, una possibilità è quella copiarlo nella memoria interna:

File file = new File(this.getFilesDir() + File.separator + "DefaultProperties.xml"); 
try { 
     InputStream inputStream = resources.openRawResource(R.id._your_id); 
     FileOutputStream fileOutputStream = new FileOutputStream(file); 

     byte buf[]=new byte[1024]; 
     int len; 
     while((len=inputStream.read(buf))>0) { 
      fileOutputStream.write(buf,0,len); 
     } 

     fileOutputStream.close(); 
     inputStream.close(); 
    } catch (IOException e1) {} 

Ora avete un File che è possibile accedere ovunque sia necessario.

+0

Questo mi ha aiutato così tanto! Grazie! Avevo bisogno del file per creare Uri per un'immagine Intent.EXTRA_STREAM contenuta nella cartella raw. – TomaszRykala

1

È possibile utilizzare InputStreamBody invece di FileBody in modo da poter usare in questo modo:

InputStream inputStream = resources.openRawResource(R.raw.yourresource); 

MultipartEntity multipartEntity= new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE); 
multipartEntity.addPart("uploaded", new InputStreamBody(inputStream)); 
Problemi correlati