为了账号安全,请及时绑定邮箱和手机立即绑定

从“资产”文件夹加载大于1M的文件

从“资产”文件夹加载大于1M的文件

慕妹3146593 2019-08-02 03:02:44
从“资产”文件夹加载大于1M的文件我要疯了,我创建了一个文件对象,这样就可以用ObjectInputStream读取它,并将资产文件夹放入其中。该方法适用于小于1M的文件,并对较大的文件产生错误。我读到这是Android平台的一个限制,但我也知道这是“很容易”避免的。例如,那些下载了“雷霆”游戏的人可以很容易地看到,在他们的“资产”文件夹中,有一个1890万个文件。这是我从ObjecInputStream读取1个对象的代码File f = File.createTempFile("mytempfile", "dat");FileOutputStream fos = new FileOutputStream(f);InputStream is = mc.getAssets().open(path,3);ObjectInputStream ois=new ObjectInputStream(is);byte[] data = (byte[]) ois.readObject();fos.write(data);fos.flush();fos.close();ois.close();is.close();现在我有了一个未压缩的文件,我可以使用它而不用担心错误“这个文件不能作为文件描述符打开,它可能是压缩的”。这个函数适用于小于1M的文件,较大的文件返回java.io.IOException在线“ObjectInputStream=新的ObjectInputStream(IS)”;为什么??
查看完整描述

3 回答

?
弑天下

TA贡献1818条经验 获得超8个赞

限制是在压缩资产上。如果资产未压缩,系统可以存储-映射文件数据,并使用Linux虚拟内存分页系统在适当情况下提取或丢弃4K块。(“zip对齐”工具确保未压缩的资产在文件中是对字对齐的,这意味着它们在直接映射时也将在内存中对齐。)

如果资产被压缩,系统必须将整个程序解压缩到内存中。如果您有20 MB的资产,这意味着应用程序占用了20 MB的物理内存。

理想情况下,系统将使用某种类型的加窗压缩,因此只需要出现部分,但这需要在资产API中有一些幻想,并且需要一种适用于随机访问的压缩方案。现在,APK=Zip具有“平减”压缩,所以这是不切实际的。

您可以通过为资产提供一个没有压缩的文件类型后缀(例如“.png”或“.mp3”)来保持未压缩资产。您还可以在构建过程中使用“zip-0”手动添加它们,而不是让AAPT捆绑它们。这可能会增加您的APK的大小。




查看完整回答
反对 回复 2019-08-03
  • 3 回答
  • 0 关注
  • 350 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信