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

Android:高效地将包含数千个文件的zip从资产复制到内部存储,android,unzip,android-assets,Android,Unzip,Android Assets,TL;DR:有没有一种方法可以将包含数千个文件的zip文件从Android资产复制到内部存储,比使用ZipInputStream更有效 我的Android应用程序有几个资产需要在首次启动时复制到设备存储中。这些文件作为zip文件存储在资产中,并通过所述的ZipInputStream进行复制(在unzip方法中)。总共有10个zip文件,总容量为36MB,解压/复制过程大约需要3秒钟 问题:我需要添加一个39MB的新资产,但它会为流程增加大约30秒。我的直觉是,这是因为资产由5500个文件组成(每

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

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

问题:我需要添加一个39MB的新资产,但它会为流程增加大约30秒。我的直觉是,这是因为资产由5500个文件组成(每个文件平均约7KB)。因为我在启动时需要这些资产,所以在后台服务中运行它不是一个选项,30秒以上的时间显示启动屏幕是一个非常长的时间

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


有没有更有效的方法来实现这一点?

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

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