gpt4 book ai didi

java - 保存大型短数组android

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:39:08 26 4
gpt4 key购买 nike

我基本上是在寻找一种在 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();

加载部分是我卡住的地方,我如何从 byte[] 中获取 short[]?我还读到过数据库也可以,但速度够快吗?

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

最佳答案

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

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[] block ,因此它受益于在两者之间使用 BufferedOutputStream。默认使用 8kB 缓冲区,但它可以增加,从而提供更好的结果。写入数据现在会将 short 转换为内存中的 byte,一旦有足够的数据可用,整个 block 将被推送到低级操作系统函数来写入它。

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();
}

关于java - 保存大型短数组android,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18109450/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com