猿问

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

从“资产”文件夹加载大于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)”;

为什么??


慕妹3146593
浏览 351回答 3
3回答

弑天下

限制是在压缩资产上。如果资产未压缩,系统可以存储-映射文件数据,并使用Linux虚拟内存分页系统在适当情况下提取或丢弃4K块。(“zip对齐”工具确保未压缩的资产在文件中是对字对齐的,这意味着它们在直接映射时也将在内存中对齐。)如果资产被压缩,系统必须将整个程序解压缩到内存中。如果您有20 MB的资产,这意味着应用程序占用了20 MB的物理内存。理想情况下,系统将使用某种类型的加窗压缩,因此只需要出现部分,但这需要在资产API中有一些幻想,并且需要一种适用于随机访问的压缩方案。现在,APK=Zip具有“平减”压缩,所以这是不切实际的。您可以通过为资产提供一个没有压缩的文件类型后缀(例如“.png”或“.mp3”)来保持未压缩资产。您还可以在构建过程中使用“zip-0”手动添加它们,而不是让AAPT捆绑它们。这可能会增加您的APK的大小。
随时随地看视频慕课网APP

相关分类

Android
我要回答