[英]storing an array in a file in java
我计划在文件中存储一个数字数组,并在需要时读取它。 什么是做到这一点的好方法? 我可以想到几种方法,例如将一行中的每个元素存储为文本文件或对其进行序列化,然后通过该方法进行存储/调用。 速度是我的首要考虑。
谢谢
如果文件不需要是人类可读的,则对其进行序列化将是更好的方法性能。 如果将每个数组条目保存为文件中的一行,则需要遍历该数组,进行一些IO操作,保存文件,稍后再将其还原为与执行所有相反步骤所需的完全相同的数组。 此外,IO操作相当昂贵。
内置的序列化机制可以为您提供所有这些功能,并且可以说是最有效的方式。
new ObjectOutputStream(new FileOutputStream("s")).writeObject(new ArrayList());
文件已保存。
在这种情况下,速度是次要问题。 为什么? 因为无论如何都在读取文件,并且I / O 较慢 (与内存操作相比)。 我只会在每行中存储一个数字,以便于人类阅读。
如果您最关心速度,请使用DataOutputStream和DataInputStream以二进制形式对其进行序列化。 就像是:
public void write(DataOutput dout, int arr[]) throws IOException
{
dout.writeInt(arr.length);
for(int a : arr) dout.writeInt(a);
}
public int[] readArray(DataInputStream din) throws IOException
{
int arr[] = new int[din.readInt()];
for(int i=0;i<arr.length;i++)
arr[i] = din.readInt();
return arr;
}
即使这还不够快,请考虑将IntBuffer用于批量操作。
二进制形式的优点是:
如果您只想存储数字数组,那么编写自己的手动序列化/反序列化例程将起作用。 它将教您有关IO操作的一些知识。
如果使用更复杂的类型(甚至是字符串),则从长远来看,使用内置的序列化方法可能会为您提供更好的服务,因为它们对于绝大多数用例而言通常更可靠。
尽管我不是Java开发人员,但在Java中使用序列化看起来相当简单。 Sun似乎对Java序列化有很好的介绍。
http://java.sun.com/developer/technicalArticles/Programming/serialization/
没有足够的有关您的用例的信息来知道最佳的方法速度明智。 (这将是多线程的,执行频率如何,数组的大小是多少,以及类似的问题)。
话虽这么说,唯一真正了解的方法就是分析它们。 序列化很简单,每行写一个数字也很简单,因此您可以尝试使用这两个数字,在所需的场景类型中对其进行分析,看看哪一个更快,并看看它们中的哪一个达到了性能目标。
一种新颖的方法:如果数字数组是唯一的整数,则可以将它们写成游程长度编码的“位集”。 这将给出非常紧凑的表示形式,这意味着更少的I / O。 我建议使用这种方法来存储非常大的唯一整数数组。
例如,假设您的数组包含值[1 ,2 ,3 ,5 ,9]
,则位集如下所示:
[1, 0, 0, 0, 1, 0, 1, 1, 1]
...并且您的RLE编码的位集为:
013113
...解释为“ 0个零,1个1、3个零,1个等”。
您可以选择将RLE编码的字符串保留为字符或使用二进制格式。
这可能是一个矫kill过正,但您可能还需要考虑JSON如何整洁地处理其key:value,基于数组的数据。 您可以将这样的数组保存到单个文件中{“ myArrays”:{“ 1”:“ [0 1 2 3 4 5]”“ 2”:“ [0 1 2 3 4 5]”
"n" : "[0 1 2 3 4 5]"
}
}
要检索数组,请读取文件内容并将其存储在StringBuffer中,将它们序列化(例如,net.sf.json.JSONSerializer),将它们转换为JSON对象,并方便地遍历每组数组。
遵循序列化是最好的方法。 但是,如果您关心的是速度,则序列化不是正确的选择。 (串行化性能很差)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.