Jak czytać plik z res / raw według nazwy

84

Chcę otworzyć plik z folderu res / raw / . Jestem absolutnie pewien, że plik istnieje. Aby otworzyć plik, który próbowałem

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

Komenda

ddd.exists(); 

daje wartość FALSE . Więc ta metoda nie działa.

Próbować

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

kończy się wyjątkiem z getMessage () „null”.

Po prostu używając

R.raw.example

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

Dlaczego dostęp do pliku w folderze / res / raw / jest tak trudny?

Bernd
źródło
możliwy duplikat Androida
Simon
Dlaczego jest znany tylko w czasie wykonywania jako ciąg? Czy mógłbyś zachować mapowanie między ciągami a identyfikatorami?
kabuko,
Przeczytaj dokumentację: developer.android.com/guide/topics/resources/ ...
dmon
Dziękuje ci za linki. Jako osobną odpowiedź podam poprawne rozwiązanie.
Bernd,

Odpowiedzi:

150

Za pomocą podanych linków udało mi się samodzielnie rozwiązać problem. Prawidłowym sposobem jest pobranie identyfikatora zasobu za pomocą

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

Aby uzyskać to jako InputStream

InputStream ins = getResources().openRawResource(
            getResources().getIdentifier("FILENAME_WITHOUT_EXTENSION",
            "raw", getPackageName()));
Bernd
źródło
16
Dla wyjaśnienia: nie dodawaj raw/nazwy pliku na początku. Prawidłowy przykład: .getIdentifier("products","raw", getPackageName());dlares/raw/products.json
JJD
4
Jak stwierdził JJD, nie potrzebujesz surowego / przed FILENAME_WITHOUT_EXTENSION. Stwierdziłem, że jeśli chcesz użyć rozszerzenia, na przykład mam dwa pliki abc.jpg i abc.zip, dodam je oba 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 komuś pomoże :)
Bruce
pamiętaj, aby zamknąć wszystkie otwarte strumienie
Pierre
Potrzebuję ścieżki do pliku ... jak mogę ją dostać zamiast strumienia wejściowego?
Rafael Lima
44

Oto przykład pobierania pliku XML z surowego folderu:

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

Następnie możesz:

 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();
    }
Emil Adz
źródło
1
Problem polega na tym, że nie mogę użyć R.raw.XYZ, ponieważ nazwa XYZ jest dostępna tylko jako ciąg. Ale link do Simona pomoże mi rozwiązać problem. Jako osobną odpowiedź podam poprawne rozwiązanie.
Bernd,
3
to działa doskonaleInputStream input = Context.getResources().openRawResource(R.raw.configjson);
Someone Somewhere
13

Możesz czytać pliki w formacie RAW / RES używając getResources().openRawResource(R.raw.myfilename).

ALE istnieje ograniczenie IDE, że nazwa pliku, którego używasz, może zawierać tylko małe litery alfanumeryczne i kropki. Dlatego nazwy plików takie jak XYZ.txtlub my_data.binnie będą wymienione w R.

user2574545
źródło
9
podkreślenie jest również dozwolone w nazwach plików zasobów
laalto
3
Dozwolone są również liczby (nie jako pierwszy znak).
Phantômaxx
Nie jako pierwszy znak ... ponieważ nie byłby to prawidłowy identyfikator zmiennej Java
peterchaula
1

Oto dwa podejścia, które możesz odczytać surowe zasoby za pomocą Kotlina.

Możesz go zdobyć, uzyskując identyfikator zasobu. Lub możesz użyć identyfikatora ciągu, w którym możesz programowo zmienić nazwę pliku z inkrementacją.

Pozdrawiam kolego 🎉

// R.raw.data_post

this.context.resources.openRawResource(R.raw.data_post)
this.context.resources.getIdentifier("data_post", "raw", this.context.packageName)
Morgan Koh
źródło