如何按名称从res / raw读取文件


82

我想从文件夹res / raw /中打开一个文件。我绝对确定该文件存在。打开我尝试过的文件

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

命令

ddd.exists(); 

产生FALSE。因此,此方法不起作用。

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

最终以getMessage()“ null”出现异常。

只需使用

R.raw.example

这是不可能的,因为文件名仅在运行时称为字符串。

为什么访问/ res / raw /文件夹中的文件如此困难?



为什么仅在运行时将其称为字符串?您能否在字符串和ID之间保持映射?
kabuko


感谢您的链接。我将给出正确的解决方案作为单独的答案。
伯恩德2013年

Answers:


147

在给定的链接的帮助下,我自己能够解决问题。正确的方法是使用

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

使其作为InputStream获得

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

15
只是为了澄清:做预先考虑raw/的文件名。有效示例:.getIdentifier("products","raw", getPackageName());forres/raw/products.json
JJD

4
如JJD所述,在FILENAME_WITHOUT_EXTENSION之前不需要raw /。我发现,如果您想使用扩展名,例如,我有两个文件abc.jpg和abc.zip,我会将它们都以abc_jpg和abc_zip的形式添加到原始文件夹中(忽略原始文件夹中的扩展名),然后分配String变量filename = abc.jpg或abc.zip,然后使用InputStream ins = getResources()。openRawResource(getResources()。getIdentifier(filename.replace(“。”,“ _”),“ raw”,getPackageName()))); 希望这对某人有帮助:)
Bruce

记得关闭所有打开的流
Pierre

我需要文件路径...如何获取它而不是输入流?
拉斐尔·利马

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的名称只能作为字符串使用。但是simon的链接可以帮助我解决问题。我将给出正确的解决方案作为单独的答案。
伯恩德2013年

3
这工作得很好InputStream input = Context.getResources().openRawResource(R.raw.configjson);
某处某人

13

您可以使用读取原始文件中的文件getResources().openRawResource(R.raw.myfilename)

但是有一个IDE限制,即您使用的文件名只能包含小写字母数字字符和点。因此,文件名(例如XYZ.txtmy_data.bin不会在R中列出)。


9
资源文件名中也允许使用下划线
laalto 2013年

3
也允许使用数字(而不是第一个字符)。
Phantômaxx

不是第一个字符...因为这不是有效的Java变量标识符
peterchaula19

1

您可以使用以下两种方法使用Kotlin读取原始资源。

您可以通过获取资源ID来获取它。或者,您可以使用字符串标识符,在其中可以以增量方式以编程方式更改文件名。

干杯

// R.raw.data_post

this.context.resources.openRawResource(R.raw.data_post)
this.context.resources.getIdentifier("data_post", "raw", this.context.packageName)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.