2013-04-09 3 views
50

Ich möchte eine Datei aus dem Ordner Res/Raw/ öffnen. Ich bin mir absolut sicher, dass die Datei existiert. Um die Datei zu öffnen ichSo lesen Sie die Datei von Res/Raw nach Name

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

Der Befehl

ddd.exists(); 

ergibt FALSCH versucht haben. Also diese Methode funktioniert nicht.

Versuch

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

endet in einer Ausnahme mit getMessage() "null" auf.

einfach

R.raw.example 

ist nicht möglich, da der Dateiname nur während der Laufzeit als String bekannt ist.

Warum ist es so schwer auf eine Datei im Ordner/res/raw/zuzugreifen?

+0

möglich Duplikat [Dynamic Resource Laden Android] (http://stackoverflow.com/questions/3648942/dynamic-resource-loading-android) – Simon

+0

Warum ist Ist es nur zur Laufzeit als String bekannt? Könnten Sie eine Zuordnung zwischen den Strings und den IDs behalten? – kabuko

+0

Lesen Sie die Dokumentation: http://developer.android.com/guide/topics/resources/providing-resources.html – dmon

Antwort

92

Mit Hilfe der angezeigten Links I konnte das Problem selbst lösen. Der richtige Weg ist es, die Ressourcen-ID mit

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

zu bekommen, um es als Input zu erhalten

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

Nur um zu verdeutlichen: Do ** nicht ** vor 'raw /' für den Dateinamen. Gültiges Beispiel: '.getIdentifier (" Produkte "," roh ", getPackageName());' für 'res/rohe/Produkte.json' – JJD

+4

Wie von JJD angegeben, brauchen Sie das rohe/vor dem FILENAME_WITHOUT_EXTENSION nicht. Ich habe festgestellt, dass, wenn Sie die Erweiterung verwenden möchten, zum Beispiel habe ich zwei Dateien abc.jpg und abc.zip, ich werde sie beide zum rohen Ordner als abc_jpg und abc_zip hinzufügen (Erweiterungen im rohen Ordner werden ignoriert), dann zuweisen String-Variable filename = abc.jpg oder abc.zip, dann benutze InputStream ins = getResources(). openRawResource (getResources(). getIdentifier (filename.replace (".", "_"), "rohe", getPackageName())); Hoffe, das hilft jemandem :) – Bruce

+0

Denken Sie daran, alle Streams zu schließen, die Sie öffnen – Pierre

29

Dies ist Beispiel für XML-Datei aus rohen Ordner unter:

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

Dann können Sie:

String sxml = readTextFile(XmlFileInputStream); 

wenn:

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

Das Problem ist, dass ich R.raw.XYZ nicht verwenden kann, weil der Name von XYZ nur als Zeichenfolge verfügbar ist. Aber die Verbindung von Simon hilft mir, das Problem zu lösen. Ich werde eine korrekte Lösung als separate Antwort geben. –

+3

das funktioniert ganz gut 'InputStream input = Context.getResources(). OpenRawResource (R.raw.configjson);' –

8

Sie Dateien im RAW/res lesen können mit getResources().openRawResource(R.raw.myfilename).

ABER gibt es eine IDE-Beschränkung, dass der Dateiname, den Sie verwenden, nur Kleinbuchstaben alphanumerische Zeichen und Punkt enthalten kann. So Dateinamen wie XYZ.txt oder my_data.bin nicht in R. aufgeführt

+8

Unterstrich ist auch in Ressourcen-Dateinamen zulässig – laalto

+2

Auch Nummern sind erlaubt (nicht als erstes Zeichen). –