Android Studio:从任何Java类访问资产文件

时间:2018-09-09 07:11:03

标签: java android android-studio assets

我需要使用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文件。

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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

您可以通过以下方式检索实例:

Axes

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

final AssetManager assets = context.getAssets();

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

找到所需的对象,并通过调用以下内容将其作为InputStream打开:

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

使用完毕后,您也可以关闭AssetManager:

final InputStream in = assets.open(name);

通常,一旦完成,您应该关闭文件流。

AssetManager在设计上没有为您提供实际的File对象,我认为这是为了保留它们,因为它们应该是只读的。

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

assets.close();

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

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

除非您当然拥有大量文件,否则在这种情况下,您可能需要开发一个过程来在应用程序运行时根据需要进行复制和清除。