我打算在文件中存储一组数字,并在需要时读取它。这样做有什么好办法?我可以想到一些方法,例如将每个元素作为文本文件存储在一行中,或者将其序列化并通过该方法存储/调用。速度是我的首要关注点。
由于
答案 0 :(得分:6)
如果文件不需要是人类可读的,那么序列化它将是更好的方法性能。 如果要将每个数组条目保存为文件中的一行,则需要遍历该数组, 做一些IO,保存文件,稍后将其恢复为完全相同的数组,你需要反向执行所有的步骤。 此外,IO操作相当昂贵。
内置的序列化机制可以为您完成所有这些工作,并且可以说是以最有效的方式。
答案 1 :(得分:3)
new ObjectOutputStream(new FileOutputStream("s")).writeObject(new ArrayList());
保存文件。
答案 2 :(得分:2)
此背景下的速度是次要问题。为什么?因为您正在读取文件 并且I / O 慢(与内存中操作相比)。我会在每行存储一个数字,因此它是人类可读的。
答案 3 :(得分:2)
如果速度是您主要关心的问题,请使用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进行批量操作。
二进制形式的优点是:
答案 4 :(得分:1)
如果您只想存储一组数字,那么编写自己的手动序列化/反序列化例程就可以了。它会教你一些关于IO操作的知识。
当你遇到更复杂的类型 - 字符串,甚至 - 然后使用内置的序列化方法可能会在长期内为你提供更好的服务,因为它们对于绝大多数用例来说通常更可靠。
虽然我不是Java开发人员,但在Java中使用序列化看起来相当简单。 Sun似乎对Java序列化有很好的介绍。
http://java.sun.com/developer/technicalArticles/Programming/serialization/
答案 5 :(得分:1)
关于您的用例,没有足够的信息可以快速了解最佳方法。 (这将是多线程的,这将多久完成一次,数组的大小和类似的问题)。
话虽这么说,唯一真正知道的方法就是剖析它们。序列化是微不足道的,每行写一个数字也很简单,所以你可以尝试这两个,在你需要的场景类型中对它们进行分析,看看哪个更快,看看它们是否达到你的性能目标。 / p>
答案 6 :(得分:1)
一种新颖的方法:如果您的数字数组是唯一的整数,您可以将它们写成游程编码的“位集”。这将提供非常紧凑的表示,意味着更少的I / O.我建议使用这种方法来存储非常大的唯一整数数组。
例如,假设您的数组包含值[1 ,2 ,3 ,5 ,9]
,您的位设置将如下所示:
[1, 0, 0, 0, 1, 0, 1, 1, 1]
...你的RLE编码比特集将是:
013113
...被解释为“0个零,1个,3个零,1个等”。
您可以选择将RLE编码的字符串保留为字符或使用二进制格式。
答案 7 :(得分:1)
这可能是一种矫枉过正,但您可能还想考虑JSON如何巧妙地处理其键:值,基于数组的数据。 您可以将这样的数组保存到单个文件中 { “myArrays”:{ “1”:“[0 1 2 3 4 5]” “2”:“[0 1 2 3 4 5]”
"n" : "[0 1 2 3 4 5]"
}
}
要检索数组,请读取文件内容并将它们存储在StringBuffer,Serialize(例如net.sf.json.JSONSerializer)中,然后将它们存储到JSON对象中,并方便地遍历每组数组。
答案 8 :(得分:-1)
序列化之后是最好的方法。但如果你担心速度序列化是不正确的选择。 (序列化性能很差)。