Cómo leer un archivo de res / raw por nombre

82

Quiero abrir un archivo de la carpeta res / raw / . Estoy absolutamente seguro de que el archivo existe. Para abrir el archivo que he intentado

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

El comando

ddd.exists(); 

produce FALSO . Entonces este método no funciona.

Molesto

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

termina en una excepción con getMessage () "null".

Simplemente usando

R.raw.example

no es posible porque el nombre del archivo solo se conoce durante el tiempo de ejecución como una cadena.

¿Por qué es tan difícil acceder a un archivo en la carpeta / res / raw /?

Bernd
fuente
posible duplicado de carga dinámica de recursos Android
Simon
¿Por qué solo se conoce en tiempo de ejecución como una cadena? ¿Podría mantener un mapeo entre las cadenas y los ID?
kabuko
Gracias por los enlaces. Daré una solución correcta como respuesta separada.
Bernd

Respuestas:

147

Con la ayuda de los enlaces proporcionados, pude resolver el problema yo mismo. La forma correcta es obtener el ID del recurso con

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

Para obtenerlo como InputStream

InputStream ins = getResources().openRawResource(
            getResources().getIdentifier("FILENAME_WITHOUT_EXTENSION",
            "raw", getPackageName()));
Bernd
fuente
15
Solo para aclarar: no anteponga raw/el nombre del archivo. Ejemplo válido: .getIdentifier("products","raw", getPackageName());parares/raw/products.json
JJD
4
Como lo indica JJD, no necesita el raw / antes de FILENAME_WITHOUT_EXTENSION. Descubrí que si desea usar la extensión, por ejemplo, tengo dos archivos abc.jpg y abc.zip, los agregaré a la carpeta sin procesar como abc_jpg y abc_zip (las extensiones en la carpeta sin procesar se ignoran), luego asignaré la variable String filename = abc.jpg o abc.zip, luego use InputStream ins = getResources (). openRawResource (getResources (). getIdentifier (filename.replace (".", "_"), "raw", getPackageName ())); Espero que esto ayude a alguien :)
Bruce
recuerde cerrar cualquier transmisión que abra
Pierre
Necesito la ruta del archivo ... ¿cómo puedo obtenerla en lugar del flujo de entrada?
Rafael Lima
44

Aquí hay un ejemplo de cómo tomar un archivo XML de una carpeta sin procesar:

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

Entonces tú puedes:

 String sxml = readTextFile(XmlFileInputStream);

cuando:

 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();
    }
Emil Adz
fuente
1
El problema es que no puedo usar R.raw.XYZ porque el nombre de XYZ solo está disponible como una cadena. Pero el enlace de simon me ayudó a solucionar el problema. Daré una solución correcta como respuesta separada.
Bernd
3
esto funciona perfectamente bienInputStream input = Context.getResources().openRawResource(R.raw.configjson);
Alguien en algún lugar
13

Puede leer archivos en formato raw / res usando getResources().openRawResource(R.raw.myfilename).

PERO existe una limitación IDE de que el nombre de archivo que usa solo puede contener caracteres alfanuméricos en minúscula y puntos. Por lo tanto, los nombres de archivos como XYZ.txto my_data.binno aparecerán en R.

user2574545
fuente
9
El subrayado también está permitido en los nombres de los archivos de recursos
laalto
3
También se permiten números (no como primer carácter).
Phantômaxx
No como el primer carácter ... porque ese no sería un identificador de variable de Java válido
peterchaula
1

Aquí hay dos enfoques en los que puede leer recursos en bruto utilizando Kotlin.

Puede obtenerlo obteniendo la identificación del recurso. O puede usar un identificador de cadena en el que puede cambiar el nombre de archivo mediante programación con incrementos.

Saludos amigo 🎉

// R.raw.data_post

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