将数组存储在java中的文件中

时间:2009-10-01 11:35:45

标签: java arrays file serialization

我打算在文件中存储一组数字,并在需要时读取它。这样做有什么好办法?我可以想到一些方法,例如将每个元素作为文本文件存储在一行中,或者将其序列化并通过该方法存储/调用。速度是我的首要关注点。

由于

9 个答案:

答案 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进行批量操作。

二进制形式的优点是:

  1. 您读取和写入的数据较少,因为二进制数据比人类可读文本更紧凑,这意味着IO不太重要。
  2. 您可以保存将数据从文本格式解析为整数的cpu周期。

答案 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)

序列化之后是最好的方法。但如果你担心速度序列化是不正确的选择。 (序列化性能很差)。