保存大型短阵列android

NiB*_*iBr 4 java io serialization android

我基本上正在寻找一种方法来保存和重新加载几个大型阵列(大约500万short)在Android上以一种快速的方式.我的应用程序需要以一种我可以在以后回复它们的方式保存它们,所以我不能只将它们保存在内存中......

到目前为止,我已经尝试将它们转换为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();
Run Code Online (Sandbox Code Playgroud)

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

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

zap*_*apl 5

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

ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(filename));
try {
    oos.writeObject(data);
} finally {
    oos.close();
}
Run Code Online (Sandbox Code Playgroud)

如果你通过它写它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();
}
Run Code Online (Sandbox Code Playgroud)

DataOutputStream写明文数据,这样您就可以直接读取数据,byte[]如果需要.如果字节顺序很重要:它使用的是Big-Endian.


由于这种方法写入单个字节而不是chucks,byte[]因此可以从BufferedOutputStream中间使用a .默认使用8kB缓冲区,但它可以增加,这可以提供更好的结果.写入数据现在将转换shortbyte内存中的s,一旦有足够的数据可用,整个块将被推送到低级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();
}
Run Code Online (Sandbox Code Playgroud)