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

Спасибо вам за ссылки. Правильное решение дам отдельным ответом.
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.


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.