我基本上正在寻找一种在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和谷歌,似乎找不到有类似问题的人,或者至少找不到它的解决方案,但作为初学者,我可能错过了一些明显的东西......
答案 0 :(得分:5)
如果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[]
的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
/ ByteArrayInputStream
。 byte[]
保存在内存中,不适合大量数据。
写入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。