【问题标题】:Copy file from Assets to /data/data将文件从资产复制到 /data/data
【发布时间】:2015-01-18 23:38:34
【问题描述】:

我已经针对同一个问题查看并尝试了十几个答案,但我没有运气。

我是 Android 开发的新手,但来自 Java / C# 背景,我很确定,我想做的不是火箭科学。

不幸的是,我无法根我正在使用的设备,所以请不要围绕根,我只需要,正如标题所示,将文件从 /assets/ 文件夹复制到我设备上的 /data/data/ 目录.

这里是我正在使用的一段代码:

private void copyDatabase(File dbFile) throws IOException {
    InputStream is = context.getAssets().open(DB_NAME);
    OutputStream os = new FileOutputStream(dbFile);

    byte[] buffer = new byte[1024];
    while (is.read(buffer) > 0) {
        os.write(buffer);
    }

    os.flush();
    os.close();
    is.close();
} 

这真的很简单,我有一个名为 DB_NAME 的静态字段,它指向 assets 文件夹。调试这一行,证明需要的文件被识别并成功输出到内存。

失败的行是下一行:... new FileOutputStream(dbFile); 我从另一个方法传入的。

dbFile的构造如下:

File dbFile = context.getDatabasePath(DB_NAME);

再一次,没什么特别的。这会获取当前上下文(应用程序)的数据库路径并将数据库的名称附加到该路径,因此为了论证,我们有,

/data/data/co.za.simple.sqlite/database/sqlitedb.db

错误消息是文件或目录不存在,这很好,对于任何将要下载应用程序的普通用户首次加载,现在,FileOutputStream(string) 的默认行为,据我所知是如果它不存在,它将创建它。

如前所述,第一次运行时,此文件不存在,但它给了我一个错误,提示找不到文件或目录。这让我相信实际的错误是应用程序没有写入 /data/ 目录的权限,所以我添加了我在列表中看到的唯一权限,适用于写入存储:

android.permission.WRITE_EXTERNAL_STORAGE

然而这完全没有效果。

如上所述,我无法根植此设备,现在也不想根植。

关于完全相同的问题,我浏览了无数博客、youtube 视图甚至这里的帖子,但这些解决方案都不适用。

我错过了什么吗?

【问题讨论】:

标签: android file-permissions copy-paste


【解决方案1】:

new FileOutputStream(stuff) 期望放置文件的目录存在。如果文件不存在,它将创建文件,但不会创建路径。缺少路径的结果是FileNotFoundException

任何正在运行的应用都应该有一个现有的/data/data/[packagename]/ 目录。但是任何子目录都是可选的。 context 的大多数方法都会在您请求后为您创建目录。 getDatabasePath 出于某种原因没有。

添加

dbFile.getParentFile().mkdirs();

在创建流之前应该解决问题。如果您不使用它,您也可以删除该权限。您的私人目录不需要任何目录。

或者使用https://github.com/jgilfelt/android-sqlite-asset-helper 也可以修复它,甚至可能会出现更多极端情况。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-24
    • 1970-01-01
    • 1970-01-01
    • 2011-07-12
    • 1970-01-01
    • 2012-05-30
    相关资源
    最近更新 更多