100 votes

Comment lire un fichier de res/raw par son nom ?

Je veux ouvrir un fichier à partir du dossier res/raw/ . Je suis absolument sûr que le fichier existe. Pour ouvrir le fichier, j'ai essayé

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

La commande

ddd.exists(); 

donne FAUX . Cette méthode ne fonctionne donc pas.

Essayer

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

aboutit à une exception avec getMessage() "null".

En utilisant simplement

R.raw.example

n'est pas possible car le nom du fichier n'est connu qu'au moment de l'exécution sous forme de chaîne.

Pourquoi est-il si difficile d'accéder à un fichier dans le dossier /res/raw/ ?

176voto

Bernd Meyer Points 292

Avec l'aide des liens indiqués, j'ai pu résoudre le problème moi-même. La méthode correcte consiste à obtenir l'ID de la ressource avec

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

Pour l'obtenir comme un InputStream

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

50voto

Emil Adz Points 12740

Voici un exemple de prise de fichier XML à partir du dossier brut :

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

Alors vous pouvez :

 String sxml = readTextFile(XmlFileInputStream);

quand :

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

14voto

user2574545 Points 141

Vous pouvez lire les fichiers en raw/res en utilisant getResources().openRawResource(R.raw.myfilename) .

MAIS il existe une limitation de l'IDE selon laquelle le nom de fichier que vous utilisez ne peut contenir que des caractères alphanumériques minuscules et un point. Ainsi, des noms de fichiers comme XYZ.txt o my_data.bin ne sera pas répertorié dans R.

4voto

Delacrix Morgan Points 205

Voici deux approches permettant de lire des ressources brutes à l'aide de Kotlin.

Vous pouvez l'obtenir en récupérant l'identifiant de la ressource. Ou bien, vous pouvez utiliser un identifiant de chaîne dans lequel vous pouvez changer le nom du fichier par incrémentation de manière programmatique.

Merci, mon pote.

// R.raw.data_post

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X