Как прочитать файл из 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 /?

Бернд
источник
возможный дубликат Android с динамической загрузкой ресурсов
Саймон
Почему он известен только во время выполнения как строка? Не могли бы вы сохранить соответствие между строками и идентификаторами?
kabuko
Прочтите документы: developer.android.com/guide/topics/resources/…
dmon,
Спасибо вам за ссылки. Правильное решение дам отдельным ответом.
Bernd

Ответы:

150

С помощью предоставленных ссылок я смог сам решить проблему. Правильный способ - получить идентификатор ресурса с помощью

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

Чтобы получить его как InputStream

InputStream ins = getResources().openRawResource(
            getResources().getIdentifier("FILENAME_WITHOUT_EXTENSION",
            "raw", getPackageName()));
Бернд
источник
16
Чтобы уточнить: не добавляйте 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-файла из необработанной папки:

 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 доступно только в виде строки. Но ссылка Саймона помогла мне решить проблему. Правильное решение дам отдельным ответом.
Bernd
3
это отлично работаетInputStream input = Context.getResources().openRawResource(R.raw.configjson);
Someone Somewhere
13

Вы можете читать файлы в формате raw / res, используя getResources().openRawResource(R.raw.myfilename).

НО существует ограничение IDE: имя файла, которое вы используете, может содержать только строчные буквы, цифры и точку. Таким образом, имена файлов вроде XYZ.txtили my_data.binне будут отображаться в R.

user2574545
источник
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)
Морган Ко
источник