繁体   English   中英

将数组存储在Java文件中

[英]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用于批量操作。

二进制形式的优点是:

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

如果您只想存储数字数组,那么编写自己的手动序列化/反序列化例程将起作用。 它将教您有关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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM