【问题标题】:Android: Efficiently copy a zip containing thousands of files from assets to internal storageAndroid:有效地将包含数千个文件的 zip 从资产复制到内部存储
【发布时间】:2019-09-16 04:24:24
【问题描述】:

TL;DR:有没有比使用ZipInputStream 更高效的方法将包含数千个文件的 zip 文件从 Android 资产复制到内部存储?

我的 Android 应用有几个资产需要在首次启动时复制到设备存储中。它们以 zip 文件的形式存储在 assets 中,并通过 ZipInputStream 复制,如 here 所述(在 unzip 方法中)。有 10 个 zip 文件,共 36MB,解压/复制过程大约需要 3 秒。

问题:我需要添加一个 39MB 的新资产,但它增加了大约 30 秒的过程。我的直觉是,这是因为资产包含 5500 个文件(平均每个文件大约 7KB)。由于我在启动时需要这些资产,因此不能在后台服务中运行它,而且 30 多秒的时间才能显示启动画面。

This post 建议使用ZipFile 而不是ZipInputStream,但正如here 和其他S/O 帖子所述,它在Android 中似乎无法正常工作,而且我遇到了与那里描述的相同的ZipException(注意这个将 zip 文件复制到内部存储之后 - Android 资产仅提供流,而不是文件,因此必须先从资产中复制 zip,然后才能使用 ZipFile 方法)。

有没有更有效的方法来解决这个问题?

【问题讨论】:

  • 如果您在文件系统中需要这么多文件,那么使用它们的代码就会出现问题。重新编写该代码,使其直接从 ZIP 文件或资产中加载文件。
  • Android APK 文件已经是 ZIP 格式的存档。或许解决方案是不要将 ZIP 文件放在 assets/ 中,而是将这些 ZIP 文件的解压缩内容放在 assets/ 中。然后,也许您可​​以就地使用它们,或者您至少可以在启动期间复制这些资产的最少数量。

标签: android unzip android-assets


【解决方案1】:

不幸的是 - 没有,因为写入每个文件都包含 3 个主要操作:创建和打开文件以进行写入,将数据写入文件,关闭文件以进行写入。复制这么多文件的最快方法 - 将它们放在一个文件中,例如二进制文件或 sqlite 数据库文件。或者您可以找到一种直接从存档中读取的方法。请记住,您将无法从资产中删除此文件(至少我从未听说过解决方案),所以它对我来说似乎没用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-14
    • 1970-01-01
    • 2021-12-24
    • 2023-03-05
    相关资源
    最近更新 更多