2013-04-09 14 views
50

Desidero aprire un file dalla cartella res/raw/. Sono assolutamente sicuro che il file esista. Per aprire il file che ho provatoCome leggere il file da res/raw per nome

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

Il comando

ddd.exists(); 

cede FALSE. Quindi questo metodo non funziona.

Cercando

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

finisce in un'eccezione con getMessage() "nullo".

Semplicemente usando

R.raw.example 

non è possibile perché il nome del file è conosciuto solo durante il funzionamento, una stringa.

Perché è così difficile accedere a un file nella cartella/res/raw /?

+0

possibile duplicato del [Risorsa dinamica Caricamento Android] (http://stackoverflow.com/questions/3648942/dynamic-resource-loading-android) – Simon

+0

Perché è noto solo al runtime come stringa? Potresti mantenere una mappatura tra le stringhe e gli ID? – kabuko

+0

Leggi i documenti: http://developer.android.com/guide/topics/resources/providing-resources.html – dmon

risposta

92

Con l'aiuto dei link forniti I è stato in grado di risolvere il problema me stesso. Il modo corretto è quello di ottenere l'ID di risorsa con

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

Per ottenere come un InputStream

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

Giusto per chiarire: Do ** not ** anteporre' raw/'per il nome del file. Esempio valido: '.getIdentifier (" products "," raw ", getPackageName());' per 'res/raw/products.json' – JJD

+4

Come dichiarato da JJD, non hai bisogno del raw/prima di FILENAME_WITHOUT_EXTENSION. Ho scoperto che se si desidera utilizzare l'estensione, ad esempio ho due file abc.jpg e abc.zip, li aggiungerò entrambi alla cartella raw come abc_jpg e abc_zip (le estensioni nella cartella raw vengono ignorate), quindi assegniamo la variabile String filename = abc.jpg o abc.zip, quindi usa InputStream ins = getResources(). openRawResource (getResources(). getIdentifier (filename.replace (".", "_"), "raw", getPackageName())); Spero che questo aiuti qualcuno :) – Bruce

+0

Ricordarsi di chiudere tutti i flussi aperti – Pierre

29

Ecco esempio di prendere file XML dalla cartella grezzo:

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

Quindi è possibile:

String sxml = readTextFile(XmlFileInputStream); 

quando:

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

Il problema è che non riesco a utilizzare R.raw.XYZ perché il nome di XYZ è disponibile solo come stringa. Ma il collegamento di simon mi aiuta a risolvere il problema. Darò una soluzione corretta come risposta separata. –

+3

funziona perfettamente. InputStream input = Context.getResources(). OpenRawResource (R.raw.configjson); ' –

8

È possibile leggere i file in/res prime che utilizzano getResources().openRawResource(R.raw.myfilename).

MA c'è una limitazione IDE che il nome del file che si utilizza può contenere solo caratteri alfanumerici in lettere minuscole e punti. Quindi il file nomi come XYZ.txt o my_data.bin non saranno elencati in R.

+8

underscore è consentito anche nei nomi file di risorse – laalto

+2

Sono consentiti anche numeri (non come primo carattere). –