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

Android Studio:从任何java类访问资产文件,java,android,android-studio,assets,Java,Android,Android Studio,Assets,我需要使用AIML实现一个聊天机器人应用程序。因此,我需要将AIML文件存储在设备的本地存储器中。我的库名是program ab(https://code.google.com/archive/p/program-ab)使用文件夹=新文件(路径)从设备本地存储获取AIML文件的方法 首先,我创建了一个资产文件夹,如 |--app |----manifests |----java |----assets |----res 并将我所需的AIML文件添加到资产文件夹 比我需要达到我的文件夹 F

我需要使用AIML实现一个聊天机器人应用程序。因此,我需要将AIML文件存储在设备的本地存储器中。我的库名是program ab(
https://code.google.com/archive/p/program-ab
)使用
文件夹=新文件(路径)从设备本地存储获取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文件。

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

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

您可以通过调用以下命令检索实例:

final AssetManager assets = context.getAssets();
final String[] names = assets.list("");
final InputStream in = assets.open(name);
拥有AssetManager后,您可以通过调用以下命令访问所有资产文件名:

final AssetManager assets = context.getAssets();
final String[] names = assets.list("");
final InputStream in = assets.open(name);
您可以通过传递相对路径而不是“”来指定要在资源内搜索的特定路径

找到所需的文件,并通过调用以下命令将其作为InputStream打开:

final AssetManager assets = context.getAssets();
final String[] names = assets.list("");
final InputStream in = assets.open(name);
您还可以在使用完AssetManager后关闭它:

assets.close();
和往常一样,完成后应该关闭文件流

AssetManager按设计不提供实际的文件对象,我假设这是为了保留它们,因为它们应该是只读的

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

final File file = new File(context.getFilesDir(), name);
final OutputStream out = new FileOutputStream(file);
ByteStreams.copy(in, out);
in.close();
out.close();
ByTestStreams在中可用,ApacheCommons在IOUtils中也有类似的方法从一个流复制到另一个流

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


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

但是我的库使用
文件
对象来访问必要的文件。我真的必须使用
InputStream
?据我所见,AssetManager仅公开流,我认为这是为了保护文件不被编辑。为了访问文件对象,您需要将资产复制到设备上的应用程序文件目录。我已经添加了一个关于如何操作的部分。感谢您的编辑。但我不明白,如果我有一个特定的方向来在应用程序文件夹结构中添加预定义的AIML文件,那么当你将一个文件添加到android studio中的资产时,它会像资源一样作为apk的一部分进行捆绑。当您调用GetFileDir时,它会提供对设备本地存储上应用程序存储目录的引用。这与android studio中的文件夹结构不同,这些文件的所有内容都转换为apk,您只能通过调用上下文(如“资产”)上的方法来访问apk。因此,我需要将我的文件添加到android studio(如facebook应用程序)中的本地存储而不是资产方向。当我在移动设备中打开文件管理器文件夹时,我会看到其他应用程序的特定文件夹。