【问题标题】:Android Studio: Reaching assets files from any java classAndroid Studio:从任何 java 类中获取资产文件
【发布时间】:2018-09-09 07:11:03
【问题描述】:

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

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

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

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

比我需要访问我的文件夹;

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

但它返回“NO”响应。那么我可以做些什么来存储和访问我的应用程序中的 AIML 文件。

【问题讨论】:

    标签: java android android-studio assets


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      要访问存储在应用程序资产中的文件,您应该使用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 中也有类似的方法从一个流复制到另一个流。

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

      当然,除非您有大量文件,在这种情况下,您可能需要开发一个流程,以便在应用运行时根据需要复制和清除它们。

      【讨论】:

      • 但是我的库使用file 对象来访问必要的文件。我真的必须使用InputStream 吗?
      • 据我所见,AssetManager 只公开流,我认为这是为了保护文件不被编辑。为了访问 File 对象,您需要将资产复制到设备上的应用程序文件目录中。我添加了有关如何执行此操作的部分。
      • 感谢您的编辑。但是我不明白,如果我有一个特定的方向来在应用程序文件夹结构中添加我的预定义 AIML 文件。
      • 当您将文件添加到 android studio 中的资产时,它会以与资源相同的方式捆绑为 apk 的一部分。当您调用 getFilesDir 时,它会为您提供对设备本地存储上应用程序存储目录的引用。这与 android studio 中的文件夹结构不同,这些文件的所有内容都转换为 apk,您只能通过调用上下文中的方法(例如“assets”)来访问。
      • 所以我需要将我的文件添加到我的本地存储而不是 android studio 中的资产方向,例如 facebook 应用程序。当我在移动设备中打开文件管理器文件夹时,我会看到其他应用程序的特定文件夹。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-10-30
      • 2014-07-27
      • 1970-01-01
      • 2014-02-14
      • 1970-01-01
      • 2013-10-14
      相关资源
      最近更新 更多