Android - 将文件从资源复制到/ data/data文件夹

sup*_*ser 10 android android-assets android-file internal-storage

我需要在我的应用程序中使用一些文件.它们保存在资产文件夹中.我看到SO上的讨论,文件从资产文件夹复制到内部存储上的/ data/data /,然后被使用.我得到了代码,但我没有得到的是,将资产复制到内部存储需要什么?如果有人有这方面的经验,请帮忙!

Mar*_*man 8

刚刚出现的一个原因是当使用现有的带有NDK的C/C++代码时,需要一个文件路径而你不想修改那个代码.

例如,我正在使用一个需要一些数据文件的现有C库,而现有的唯一接口是一些"load(char*path)"函数.

也许实际上有一些更好的方法,但我还没有找到任何方法.


Lav*_*wal 6

试试这个:(使用它的所有三种方法为我工作并在"toPath"字符串对象中分配目标路径)

  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);
        }
    }
Run Code Online (Sandbox Code Playgroud)

  • 正确的想法,但你不应该硬编码/ data目录(因为它可能会改变),而是在运行时通过适当的api发现它. (3认同)
  • 为什么不使用`<application Context> getFilesDir()`方法而不是“ / data / data / <package name>”? (2认同)