保存大型短阵列android

时间:2013-08-07 17:04:51

标签: java android serialization io

我基本上正在寻找一种在Android上以快速方式保存和重新加载一些大型数组(大约500万short)的方法。我的应用程序需要保存它们,以便我可以在以后很长时间内回复它们,所以我不能只将它们保存在内存中......

到目前为止,我已经尝试将它们转换为byte[]数组并且它们似乎成功保存,但我无法获取数据,这就是我的保存代码的工作原理(它实际上是分离函数) ,简化了这里):

ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOuputStream oos = new ObjectOutputStream(baos);
oos.writeObject(data);
oos.close();
baos.close();
FileOutputStream fos = new FileOutputStream(filename); // valid absolute path
fos.write(baos.toByteArray());
fos.close();

加载部分是我卡住的地方,如何从short[]获得byte[]? 我还读到数据库可能也可以工作,但是它足够快吗?

我看了看Stackoverflow和谷歌,似乎找不到有类似问题的人,或者至少找不到它的解决方案,但作为初学者,我可能错过了一些明显的东西......

3 个答案:

答案 0 :(得分:5)

如果datashort[]并且您想将整个事物写入文件,请不要在内存中使用缓冲区,直接写入。

ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(filename));
try {
    oos.writeObject(data);
} finally {
    oos.close();
}

如果您通过ObjectOutputStream撰写,则必须通过ObjectInputStream阅读,因为它不仅仅是编写纯数据,还包括一些类型信息。如果你输入short[],你会得到一个short[](你可以尝试跳过这些字节,但你必须分析这个流实际写的是什么)。如果您的ObjectOutputStream写入ByteArrayOutputStream

,这也适用

如果你不想处理那个烂摊子,那就做ObjectOutputStream基本上做的事情:

DataOutputStream dos = new DataOutputStream(new FileOutputStream(filename));
try {
    for (int i = 0; i < data.length; i++) {
        dos.writeShort(data[i]);
    }
} finally {
    dos.close();
}

DataOutputStream会写明文数据,因此您可以根据需要直接将数据作为byte[]读取。如果字节顺序很重要:它使用的是Big-Endian。


由于这种方法写入单个字节而不是byte[]的chuck,因此在中间使用BufferedOutputStream会有所帮助。默认使用8kB缓冲区,但它可以增加,这可以提供更好的结果。编写数据现在将short转换为内存中的byte,一旦有足够的数据可用,整个块将被推送到低级OS函数进行写入。

int bufferSize = 32 * 1024;
DataOutputStream dos = new DataOutputStream(
        new BufferedOutputStream(
                new FileOutputStream(filename),
                bufferSize)
        );
try {
    for (int i = 0; i < data.length; i++) {
        dos.writeShort(data[i]);
    }
} finally {
    dos.close();
}

答案 1 :(得分:1)

直接使用文件流,无需缓冲ByteArrayOutputStream / ByteArrayInputStreambyte[]保存在内存中,不适合大量数据。

写入new ObjectOutputStream(new FileOutputStream(filename)),您可以使用new ObjectInputStream(new FileInputStream(filename))恢复对象。如果需要,您也可以按Christopher's answer中提到的那样进行缓冲。

答案 2 :(得分:0)

你可以在这里使用这个方法:byte array to short array and back again in java然后编写并读取bytearray。我还建议使用BufferedOutputStream而不是FileOutputStream。