Android:高效地将包含数千个文件的 zip 从 Assets 复制到内部存储

标签 android unzip android-assets

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

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

问题:我需要添加一个 39MB 的新 Assets ,但它会增加大约 30 秒的过程。我的直觉是,这是因为该 Assets 包含 5500 个文件(平均每个文件约 7KB)。由于我在启动时需要这些 Assets ,因此无法在后台服务中运行它,而且 30 秒以上显示启动画面的时间确实很长。

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

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

最佳答案

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

关于Android:高效地将包含数千个文件的 zip 从 Assets 复制到内部存储,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55871266/

相关文章:

java - zip4j可以用来解压Tar文件吗?

java - 如何生成介于 1 和任何值之间的随机 BigInteger 数字?

来自多个 Activity 的 Android TTS

download - 为什么我不能让 st_read 从压缩文件中打开 shapefile? (如果保存在本地 Onedrive 文件夹中但未在 R 中解压缩,则会读取 map )

当 zip 文件更改时,CMake 自动解压缩(在构建时)

java - 安卓/Java : displaying images from assets and/or internal/sd storage

java - NullPointerException 试图访问 String 资源

Android Room 数据库迁移没有正确处理

javascript - Access-Control-Allow-Origin 不允许 Origin null。 :1 in android web view?

android - 使用 FFmpeg Android 错误更改音频音量