Android Studio:从任何java类中获取资源文件

问题描述 投票:0回答:2

我需要使用AIML实现聊天机器人应用程序。所以我需要将我的AIML文件存储在我设备的本地存储中。我的库名为program-ab(https://code.google.com/archive/p/program-ab),它使用File folder = new File(path);方法从设备本地存储中获取AIML文件。

首先我创建了一个资产文件夹;

|--app
|----manifests
|----java
|----assets
|----res

并将我所需的AIML文件添加到资源文件夹。

比我需要到达我的文件夹;

   File file = new File(this.getBaseContext().getFilesDir(), "assets");
    if (file.exists())
    {
        System.out.println("OK");
    }
    else
    {
        System.out.println("NO");
    }

但它让我回答“不”。那么我该怎么做才能从我的应用程序中存储和访问我的AIML文件。

java android android-studio assets
2个回答
0
投票

不要将文件存储在项目的/ app文件夹中。这不是一个好习惯。而是将文件存储在本地存储上。


0
投票

要访问存储在应用程序资产中的文件,您应该使用AssetManager

您可以通过调用以下方法检索实例:

final AssetManager assets = context.getAssets();

拥有AssetManager后,您可以通过调用以下方式访问所有资产文件名:

final String[] names = assets.list("");

您可以通过传递相对路径而不是“”来指定要在资产内搜索的特定路径

找到你想要的那个,并通过调用以下方法将其作为InputStream打开:

final InputStream in = assets.open(name);

您也可以在完成使用后关闭AssetManager:

assets.close();

和往常一样,一旦完成,你应该关闭文件流。

AssetManager设计并没有给你实际的File对象,我认为这是为了保留它们,因为它们应该是只读的。

要将其转换为File对象,您可以使用将资产的内容复制到应用程序存储目录中的文件。

final File file = new File(context.getFilesDir(), name);
final OutputStream out = new FileOutputStream(file);
ByteStreams.copy(in, out);
in.close();
out.close();

ByteStreams在Google Guava中可用,Apache Commons也有类似的方法从IOUtils中的一个流复制到另一个流。

这是一项繁重的操作,因此在首次启动应用程序时将资产复制到本地存储可能是值得的,然后使用本地副本,因此您不需要每次都复制。

除非您拥有大量文件,否则您可能需要在应用程序运行时根据需要开发复制和清除它们的过程。

© www.soinside.com 2019 - 2024. All rights reserved.