将文件存储在 Android 上以供本地阅读

Storing file on Android for Native reading

我正在为 android 编写应用程序并且我正在使用 caffe 库。我的问题是开始时我需要初始化 caffe,这是通过将两个文件(网络结构)传递给 caffe 来完成的。 问题是我不知道如何在设备上存储额外的文件。我已经将模型文件添加到资产中,但我不知道如何使用文件路径读取它。你能告诉我在哪里存储这些可以使用文件路径访问的文件吗?

感谢任何想法。

这应该可以做到。只需将这些文件从资产文件夹复制到数据目录即可。如果您已经拥有这些文件,只需加载它们即可。

String toPath = "/data/data/" + getPackageName();  // Your application path




private static boolean copyAssetFolder(AssetManager assetManager,
            String fromAssetPath, String toPath) {
        try {
            String[] files = assetManager.list(fromAssetPath);
            new File(toPath).mkdirs();
            boolean res = true;
            for (String file : files)
                if (file.contains("."))
                    res &= copyAsset(assetManager, 
                            fromAssetPath + "/" + file,
                            toPath + "/" + file);
                else 
                    res &= copyAssetFolder(assetManager, 
                            fromAssetPath + "/" + file,
                            toPath + "/" + file);
            return res;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }

private static boolean copyAsset(AssetManager assetManager,
        String fromAssetPath, String toPath) {
    InputStream in = null;
    OutputStream out = null;
    try {
      in = assetManager.open(fromAssetPath);
      new File(toPath).createNewFile();
      out = new FileOutputStream(toPath);
      copyFile(in, out);
      in.close();
      in = null;
      out.flush();
      out.close();
      out = null;
      return true;
    } catch(Exception e) {
        e.printStackTrace();
        return false;
    }
}

private static void copyFile(InputStream in, OutputStream out) throws IOException {
    byte[] buffer = new byte[1024];
    int read;
    while((read = in.read(buffer)) != -1){
      out.write(buffer, 0, read);
    }
}

将它们作为资产放入您的项目中,然后在应用启动时,您可以从资产中读取它们并将它们复制到应用的私有存储区中。您可以使用 Context.getFilesDir().

找到此目录

从那里,您将能够将文件传递给 Caffe。

资产被打包并且只能使用特殊方法访问,所以我通过访问文件解决了问题,然后将其复制到我传递给本机方法的新位置。