Java 快速将int[]写入磁盘?

Java 快速将int[]写入磁盘?,java,android,mobile,Java,Android,Mobile,在我的Android应用程序中,我有一个位图对象和一个int[]。我应用程序中的一个算法将位图像素值复制到int[],然后修改后者中的值 我想尽快将原始int[]的内容保存到磁盘。什么是一种快速高效的方法?(也就是说,在Android中,对每个int[]项调用.writeInt函数的速度非常慢,因为大多数设备上都没有JIT) 我发现,如果我创建一个与int[]大小相同的字节[],并将int[]复制到字节[],那么我就可以在一次API调用中使用多种文件io方法之一将字节[]写入磁盘。但是,这会占用

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

我想尽快将原始int[]的内容保存到磁盘。什么是一种快速高效的方法?(也就是说,在Android中,对每个int[]项调用.writeInt函数的速度非常慢,因为大多数设备上都没有JIT)

我发现,如果我创建一个与int[]大小相同的字节[],并将int[]复制到字节[],那么我就可以在一次API调用中使用多种文件io方法之一将字节[]写入磁盘。但是,这会占用大量额外内存,因为我现在有两个版本的int[]

如果做不到这一点,也许有某种方法可以直接将位图的int值写入文件?如果是这样,我可以将int[]复制回位图对象并使用它


顺便说一下,我不想使用“.png”压缩,只想保存原始值,因为后者要快得多

我认为您必须分配一个缓冲区(
byte[]
),该缓冲区的大小必须能够最大限度地提高性能,并且仍然只使用合理的内存量。也许是8K


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

我认为您可以利用缓冲区流概念,只需将int[]的一部分转换为byte[]并写入,然后进行下一批处理。尝试测试并确定一个对内存要求不太高但足够有效的缓冲区大小,我认为几个KBs就足够了

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


-niko

您也可以尝试一下ObjectOutputStream.writeObject(myIntArray)。也许它在引擎盖下做了一些很聪明的事情。谢谢,我来试试。不过,我对缺少writeInArray函数感到非常惊讶。顺便问一下,有没有一种简单的方法来了解writeObject是如何为数组实现的?我不知道该去哪里找。这可能是一个很好的方法,但是,考虑到未来,如果不再次使用Java,这将使读取文件变得困难。是的,如果需要跨平台的话,我不会使用writeObject(另一方面,它几乎肯定只是一个头,然后是整数序列)。如果您发现了用于基本数组的writeObject的实现(在JDK或Android中),请告诉我。实际上,使用readObject可能是一个非常糟糕的主意。如果我有1Mb的二进制数据保存为一个对象,readObject将创建1Mb的垃圾供GC处理,因为我在内存中不需要两个int[]s。我有我的位图和int[]。我将int[]写入磁盘。然后我执行readObject以获取返回的值,这将创建另一个int[]。我现在有2个int[]在内存中,我只需要一个,这样一个就变成了垃圾。