如何从 asset/raw 目录访问文件

How to access a file from asset/raw directory

使用下面的代码,我试图访问存储在 asset/raw 文件夹中的文件,但得到 null

E/ERR: file:/android_asset/raw/default_book.txt (No such file or directory)

错误,我的代码是:

private void implementingDefaultBook() {
    String filePath = Uri.parse("file:///android_asset/raw/default_book.txt").toString();
    File   file     = new File(filePath);
    try {
        FileInputStream stream      = new FileInputStream(file);
    } catch (Exception e) {
        e.printStackTrace();
        Log.e("ERR ", e.getMessage());
    } catch (OutOfMemoryError e) {
        e.printStackTrace();
    }
}

资产和资源是您开发机器上的文件。它们不是设备上的文件。

对于资产,在 AssetManager 上使用 open() 以获得资产的 InputStream

此外,FWIW:

  • Uri.parse("file:///android_asset/raw/default_book.txt").toString() 毫无意义,因为它给你的字符串与你开始时使用的字符串相同

  • file:///android_asset/ 仅适用于 WebView

InputStream is = getAssets().open("default_book.txt");

将您的文本文件放在 Android 项目下的 /assets 目录中,然后使用 AssetManager class 如下访问它。

AssetManager am = context.getAssets();
InputStream is = am.open("default_book.txt");

或者你也可以将文件放在/res/raw目录下,从这里可以通过id访问文件如下

InputStream is = 
context.getResources().openRawResource(R.raw.default_book);

由于实际问题没有得到充分回答,我们开始

InputStream is = context.getAssets().openFd("raw/"+"filename.txt")

上下文可以是 thisgetActivity() 或基本上任何其他上下文

重要的是在文件名之前包含由 /

分隔的文件夹

在Kotlin中我们可以实现as-

val string = requireContext().assets.open("default_book.txt").bufferedReader().use {
                it.readText()
            }