Подтвердить что ты не робот

Как читать файл из res/raw по имени

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

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

Команда

ddd.exists(); 

дает ЛОЖЬ. Поэтому этот метод не работает.

Попытка

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

заканчивается в исключении с помощью getMessage() "null".

Просто используя

R.raw.example

невозможно, поскольку имя файла известно только во время выполнения в виде строки.

Почему так сложно получить доступ к файлу в папке/res/raw/?

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

Вот пример взятия 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();
    }

Ответ 3

Вы можете читать файлы в raw/res с помощью getResources().openRawResource(R.raw.myfilename).

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

Ответ 4

Вот два подхода, которые вы можете читать с помощью Kotlin.

Вы можете получить его, получив идентификатор ресурса. Или вы можете использовать строковый идентификатор, в котором вы можете программно изменить имя файла с приращением.

Ура, приятель 🎉

// R.raw.data_post

this.context.resources.openRawResource(R.raw.data_post)
this.context.resources.getIdentifier("data_post", "raw", this.context.packageName)