4

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

到目前为止,我已经尝试将它们转换为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[]从 a 中得到 a byte[]?我还读到数据库也可以工作,但它足够快吗?

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

4

3 回答 3

6

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

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[]因此它受益于BufferedOutputStream在两者之间使用 a 。默认使用 8kB 缓冲区,但可以增加它可以提供更好的结果。写入数据现在将在内存中转换shortbytes ,一旦有足够的数据可用,整个块将被推送到低级 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();
}
于 2013-08-07T17:58:58.680 回答
1

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

写入new ObjectOutputStream(new FileOutputStream(filename)),您可以使用new ObjectInputStream(new FileInputStream(filename)). 如果你愿意,你也可以像Christopher's answer中提到的那样做一些缓冲。

于 2013-08-07T17:21:19.703 回答
0

您可能可以在这里使用该方法:字节数组到短数组并在java中再次返回,只需写入和读取字节数组。我还建议使用BufferedOutputStream而不仅仅是 FileOutputStream。

于 2013-08-07T17:18:29.313 回答