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?


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,


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()));

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();
    }

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.


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)
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.