2013-04-09 19 views
50

Chcę otworzyć plik z folderu res/raw/. Jestem absolutnie pewien, że plik istnieje. Aby otworzyć plik PróbowałemJak odczytać plik z res/raw o nazwie

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

Komenda

ddd.exists(); 

daje FAŁSZ. Ta metoda nie działa.

Próba

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

kończy się wyjątek z getMessage() "zerowego".

prostu za pomocą

R.raw.example 

nie jest możliwe, ponieważ nazwa pliku jest znana tylko podczas wykonywania jako ciąg znaków.

Dlaczego tak trudno uzyskać dostęp do pliku w folderze/res/raw /?

+0

możliwe duplikat [Dynamic zasobów Ładowanie Android] (http://stackoverflow.com/questions/3648942/dynamic-resource-loading-android) – Simon

+0

Dlaczego to tylko znane w czasie wykonywania jako ciąg znaków? Czy możesz zachować odwzorowanie między łańcuchami i identyfikatorami? – kabuko

+0

Przeczytaj dokumentację: http://developer.android.com/guide/topics/resources/providing-resources.html – dmon

Odpowiedz

92

Z pomocą podanych linków ja był w stanie rozwiązać problem sam. Prawidłowy sposób to uzyskać identyfikator zasobów z

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

Aby go jako InputStream

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

Aby wyjaśnić: Do ** not ** z góry 'raw /' dla nazwy pliku. Prawidłowy przykład: '.getIdentifier (" produkty "," raw ", getPackageName());' dla 'res/raw/products.json' – JJD

+4

Jak stwierdził JJD, nie potrzebujesz raw/before FILENAME_WITHOUT_EXTENSION. Zauważyłem, że jeśli chcesz korzystać z rozszerzenia, na przykład mam dwa pliki abc.jpg i abc.zip, dodam je do folderu raw jako abc_jpg i abc_zip (rozszerzenia w folderze raw są ignorowane), a następnie przypisz zmienną String filename = abc.jpg lub abc.zip, a następnie użyj InputStream ins = getResources(). openRawResource (getResources(). getIdentifier (filename.replace (".", "_"), "raw", getPackageName())); Mam nadzieję, że to pomoże komuś :) – Bruce

+0

pamiętaj o zamknięciu wszystkich otwartych strumieni – Pierre

29

Oto przykład biorąc plik XML z surowego folderu:

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

Następnie można:

String sxml = readTextFile(XmlFileInputStream); 

gdy:

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

Problem polega na tym, że nie mogę używać R.raw.XYZ, ponieważ nazwa XYZ jest dostępna tylko jako ciąg. Ale link Simona pomaga mi rozwiązać problem. Podam prawidłowe rozwiązanie jako oddzielną odpowiedź. –

+3

działa to idealnie dobrze 'InputStream input = Context.getResources(). OpenRawResource (R.raw.configjson);' –

8

Można odczytać pliki w formacie RAW/res pomocą getResources().openRawResource(R.raw.myfilename).

ALE istnieje ograniczenie IDE, że nazwa pliku, którego używasz, może zawierać jedynie małe litery i cyfry. Tak jak nazwy plików XYZ.txt lub my_data.bin nie zostaną wymienione w R.

+8

podkreślenie jest dozwolone także w nazwach plików zasobów – laalto

+2

Również liczby są dozwolone (nie jako pierwsza litera). –