2010-11-02 98 views
2

在我的Android应用程序中,我有一个Bitmap对象和一个int []。我的应用程序中的一种算法将位图像素值复制到int [],然后修改后者中的值。快速写入int []到磁盘?

我想尽快将原始int []的内容保存到磁盘。什么是快速和高效的内存方式? (即调用每个int []项上的.writeInt函数在Android中执行此操作会非常缓慢,因为在大多数设备上没有JIT)

我发现如果我创建了一个字节[]与int []大小相同并将int []复制到byte [],然后我可以使用多个文件io方法之一在一次API调用中将byte []写入磁盘。然而,这使用了很多额外的内存,因为我现在有两个版本的int []。

失败了,也许有一些方法会直接将位图的int值写入文件中?如果是这样,我可以将int []复制回Bitmap对象并使用它。顺便说一句,我不想​​使用“.png”压缩,只是想保存原始值,因为后者更快。

回答

1

我想你将不得不分配一个缓冲区(byte[]),这个缓冲区的大小可以最大化性能,并且仍然只使用合理的内存量。也许像8K一样。

然后,您在页面(缓冲区大小/ 4)中遍历数组,然后填充缓冲区并将其写出。下一页可以重用相同的缓冲区。确保你正确处理最后一页,这可能是半空的(当然有位图,它可能与8K缓冲区对齐)。

+1

您也可以尝试ObjectOutputStream.writeObject(myIntArray)。也许它在本质上做了一些巧妙的事情。 – Thilo 2010-11-02 02:20:51

+0

谢谢,我会放弃这一点。我很惊讶于缺少writeIntArray函数。顺便说一下,有没有一种简单的方法来查看如何为数组实现writeObject?我不确定在哪里看。这可能是一个好方法,但考虑到未来,这使得很难在不使用Java的情况下阅读文件。 – RichardNewton 2010-11-02 02:28:55

+1

是的,如果它需要跨平台(另一方面,它几乎肯定只是一个头,然后是整数序列),我不会使用writeObject。让我知道你是否发现了原始数组的writeObject实现(在JDK或Android中)。 – Thilo 2010-11-02 02:31:29

1

我认为你可以使用缓冲流的概念,只是将你的int []的部分转换为byte []并写入,然后执行下一批。尝试测试并确定一个对内存要求不高,但效率足够高的缓冲区大小,我认为几个KB就足够了。

0

最快的方法是创建一个使用C函数写出来的NDK库,然后将使用JNI的Int数组传递给C例程。

-niko

+0

这很难吗?它适用于所有Android手机吗? – RichardNewton 2010-11-03 01:01:13