2011-09-26 56 views
0

我有一个大的int数组,其中包含格式为ARGB(alpha,R,G和B通道,每个1个字节)的图像数据。我想将它保存到onPause()中以便能够在应用程序重新启动时重新加载它。你认为最好的方法是做什么?什么是向文件写入int数组(图像数据)的最佳方式

我发现了以下方法:

  • 手动int数组转换为字节阵列(见here),然后使用一个FileOutputStream到输出字节数组。

  • 将数组换成java.nio.IntBuffer,然后使用java.io.ObjectOutputStream.writeObject()将对象写入文件。

  • 使用java.io.ObjectOutputStream.writeInt()一次写入每个元素一个。

所有这些方法看起来相当浪费,所以有可能是另一种更好的方法。可能甚至是使用图像压缩来减小文件大小的方法?

回答

1

没有那些。其中一些甚至没有意义。

DataOutputStream dos = new DataOutputStream(new BufferedOutputStream(new FileOutputStream(file))); 

然后调用dos.writeInt()多次必要,然后关闭dos。缓冲区将带走大部分的痛苦。

否则创建一个IntBuffer并使用FileChannel.write(),但我从来没有能够找出如何在没有IntBuffer.asByteBuffer()方法的情况下工作。否则,创建一个ByteBuffer,将其作为IntBuffer,通过asIntBuffer(),将数据放入,然后调整ByteBuffer的长度,这是API的另一个缺失部分,并再次使用FileChannel.write(ByteBuffer)

2

从我的角度来看,你也可以使用Android专用存储器

  1. 使用数据库/内容提供商用于存储图像数据
  2. 使用了捆绑在onSaveInstance方法

如果你仍然想要写入文件,您可以使用以下基于NIO的代码:

static void writeIntArray(int[] array) throws IOException { 
    FileOutputStream fos = new FileOutputStream("out.file"); 
    try { 
     ByteBuffer byteBuff = ByteBuffer.allocate((Integer.SIZE/Byte.SIZE) * array.length); 
     IntBuffer intBuff = byteBuff.asIntBuffer(); 
     intBuff.put(array); 
     intBuff.flip(); 
     FileChannel fc = fos.getChannel(); 
     fc.write(byteBuff); 
    } finally { 
     fos.close(); 
    } 
} 
+0

I alr eady尝试了onSaveInstance,但遇到了一个奇怪的问题。使用序列主页按钮 - >重新启动应用程序 - >关闭屏幕(按下电源按钮) - >恢复(再次按下电源按钮),onCreate()被调用一次空束,onSaveInstance被调用,然后再次调用onCreate 。结果是包中的数据丢失了。这似乎只在onSaveInstance()中的处理很长且应用程序设置为android:screenOrientation =“landscape”时才会出现。 – Pooks

相关问题