【问题标题】:Resources.openRawResource() issue AndroidResources.openRawResource() 问题 Android
【发布时间】:2010-10-30 15:56:15
【问题描述】:

我在res/raw/ 文件夹中有一个数据库文件。我正在调用Resources.openRawResource(),文件名为R.raw.FileName,我得到一个输入流,但我在设备中有另一个数据库文件,所以将该数据库的内容复制到我使用的设备数据库:

 BufferedInputStream bi = new BufferedInputStream(is);

和 FileOutputStream,但我得到一个异常,即数据库文件已损坏。我该如何进行? 我尝试使用FileFileInputStream 读取文件,路径为/res/raw/fileName,但这也不起作用。

【问题讨论】:

  • 是否有任何机构面临与我使用 openFileInput 方法相同的问题,但它检查的是设备路径而不是项目路径 ....

标签: java android


【解决方案1】:

是的,您应该能够使用 openRawResource 将二进制文件从原始资源文件夹复制到设备。

根据 API 演示 (content/ReadAsset) 中的示例代码,您应该能够使用以下代码 sn-p 的变体来读取 db 文件数据。

InputStream ins = getResources().openRawResource(R.raw.my_db_file);
ByteArrayOutputStream outputStream=new ByteArrayOutputStream();
int size = 0;
// Read the entire resource into a local byte buffer.
byte[] buffer = new byte[1024];
while((size=ins.read(buffer,0,1024))>=0){
  outputStream.write(buffer,0,size);
}
ins.close();
buffer=outputStream.toByteArray();

您的文件副本现在应该存在于buffer 中,因此您可以使用FileOutputStream 将缓冲区保存到新文件中。

FileOutputStream fos = new FileOutputStream("mycopy.db");
fos.write(buffer);
fos.close();

【讨论】:

    【解决方案2】:

    InputStream.available 有严格的限制,绝不能用于确定可用于流式传输的内容的长度。

    http://developer.android.com/reference/java/io/FileInputStream.html#available(): “[...]返回估计的字节数,在没有阻塞的情况下可以读取或跳过更多输入。[...]请注意,此方法提供的保证非常弱,因此在实践中不是很有用。”

    您有 3 个解决方案:

    1. 遍历内容两次,第一次只是计算内容长度,第二次是实际读取数据
    2. 由于 Android 资源是由您(开发人员)准备的,因此对其预期长度进行硬编码
    3. 将文件放在 /asset 目录中并通过 AssetManager 读取它,它使您可以访问 AssetFileDescriptor 及其内容长度方法。但是,这可能会为您提供 UNKNOWN 的长度值,这不是很有用。

    【讨论】:

    • 嗨,现在还有效吗?
    • @elect 保证提及已从 API 中删除,但我仍然会在实践中避免使用该方法。
    • 好的,关于 3),为什么会返回 unknown
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-24
    • 2011-08-04
    • 1970-01-01
    • 2013-10-09
    • 2011-10-07
    • 2017-10-05
    • 2014-04-29
    相关资源
    最近更新 更多