Як прочитати файл із res / raw за назвою


84

Я хочу відкрити файл із папки res / raw / . Я абсолютно впевнений, що файл існує. Щоб відкрити файл, який я спробував

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

Команда

ddd.exists(); 

дає ФАЛШ . Отже, цей метод не працює.

Намагається

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

закінчується винятком з getMessage () "null".

Просто використовуючи

R.raw.example

неможливо, оскільки ім'я файлу відомо лише під час виконання як рядок.

Чому так важко отримати доступ до файлу в папці / res / raw /?



Чому він відомий лише під час виконання як рядок? Не могли б ви зберегти відображення між рядками та ідентифікаторами?
kabuko

Прочитайте документи: developer.android.com/guide/topics/resources/…
dmon

Дякую за посилання. Я дам правильне рішення як окрему відповідь.
Бернд

Відповіді:


150

За допомогою наведених посилань я зміг самостійно вирішити проблему. Правильним способом є отримання ідентифікатора ресурсу за допомогою

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

Щоб отримати його як InputStream

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

16
Просто для уточнення: Do НЕ випереджати raw/для імені файлу. Дійсний приклад: .getIdentifier("products","raw", getPackageName());дляres/raw/products.json
JJD

4
Як заявляє JJD, вам не потрібне raw / перед FILENAME_WITHOUT_EXTENSION. Я виявив, що якщо ви хочете використовувати розширення, наприклад, у мене є два файли abc.jpg та abc.zip, я додаю їх обидва до вихідної папки як abc_jpg та abc_zip (розширення у вихідній папці ігноруються), а потім призначити змінну String filename = abc.jpg або abc.zip, а потім використовуйте InputStream ins = getResources (). openRawResource (getResources (). getIdentifier (filename.replace (".", "_"), "raw", getPackageName ())); Сподіваюся, це комусь допомагає :)
Брюс

не забудьте закрити будь-які потоки, які ви відкриваєте
П'єр,

мені потрібен шлях до файлу ... як я можу отримати його замість вхідного потоку?
Рафаель Ліма,

44

Ось приклад взяття XML-файлу з папки raw:

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

Тоді ви можете:

 String sxml = readTextFile(XmlFileInputStream);

коли:

 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
Проблема в тому, що я не можу використовувати R.raw.XYZ, оскільки назва XYZ доступна лише у вигляді рядка. Але посилання на simon допоможе мені вирішити проблему. Я дам правильне рішення як окрему відповідь.
Бернд

3
це працює чудовоInputStream input = Context.getResources().openRawResource(R.raw.configjson);
Хтось десь

13

Ви можете читати файли в raw / res за допомогою getResources().openRawResource(R.raw.myfilename).

АЛЕ існує обмеження IDE, що назва файлу, яку ви використовуєте, може містити лише малі літерно-цифрові символи та крапку. Тож імена файлів, як-от XYZ.txtабо my_data.binне будуть перелічені в R.


9
Підкреслення також допускається в іменах файлів ресурсів
laalto

3
Також допускаються цифри (не як перший символ).
Phantômaxx

Не як перший символ ... тому що це не буде дійсним ідентифікатором змінної Java
peterchaula

1

Ось два підходи, за якими можна прочитати вихідні ресурси за допомогою Kotlin.

Ви можете отримати його, отримавши ідентифікатор ресурсу. Або ви можете використовувати ідентифікатор рядка, в якому ви можете програмно змінити ім'я файлу із збільшенням.

Вітайте пару 🎉

// R.raw.data_post

this.context.resources.openRawResource(R.raw.data_post)
this.context.resources.getIdentifier("data_post", "raw", this.context.packageName)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.