2009-10-01 51 views
1

我計劃將一個數組數組存儲在文件中,並在需要時讀取它。什麼是這樣做的好方法?我可以想到很多方法,比如將每個元素作爲文本文件存儲在一行中,或者將其序列化並通過該方法存儲/調用。速度是我首先關心的問題。將數組存儲在java中的文件中

感謝

回答

6

如果該文件並不需要是人類可讀的,則其序列將是更好的辦法性能明智的。 如果您要將每個數組條目保存爲文件中的一行,您需要遍歷數組, 做一些IO,保存文件,稍後將其恢復爲完全相同的數組,您需要完成所有步驟相反。此外,IO操作相當昂貴。

內置的序列化機制爲您做了所有這些工作,並且可以以最有效的方式進行。

2

在這方面的速度是次要問題。爲什麼?因爲你正在讀文件無論如何和I/O是(與內存操作相比)。我只是將它們每行存儲一個數字,以便它可讀。

+0

對於基於文本的存儲有很多需要說的。如果存儲是一個問題,你總是可以壓縮它。 – SteveD 2009-10-01 14:45:42

-1

以下序列化是最好的方法。但是,如果你的擔心是速度序列化是不正確的選擇。 (序列化性能差)。

+2

相比較差什麼? – jarnbjo 2009-10-01 13:26:44

1

如果你只想存儲一個數字數組,然後編寫你自己的手動序列化/反序列化例程將工作。它會教你一些關於IO操作的東西。

當你遇到更復雜的類型 - 字符串,甚至 - 然後使用內置的序列化方法從長遠來看可能會更好地爲你服務,因爲它們通常對絕大多數用例來說更可靠。

儘管我不是Java開發人員,但在Java中使用序列化看起來相當簡單。 Sun似乎對Java序列化有了很好的介紹。

http://java.sun.com/developer/technicalArticles/Programming/serialization/

1

沒有對你的使用情況,以瞭解最佳的進場速度明智的足夠信息。 (這是多線程的,多久會這樣做,數組的大小和這樣的問題)。

這就是說,唯一真正知道的方法就是分析它們。序列化是微不足道的,每行寫一個數字也很簡單,所以你可以嘗試這兩個,根據你需要的場景類型來描述它們,查看哪一個更快,看看它們中的任何一個是否達到你的性能目標。

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週期。
1

一種新穎的方法:如果你的數組數組是唯一的整數,你可以把它們寫成一個遊程長度編碼的「位集」。這將提供非常緊湊的表示,意味着更少的I/O。我會建議這種方法來存儲非常大的唯一整數數組。

例如,假設你的數組包含的值[1 ,2 ,3 ,5 ,9],你的位設置是這樣的:

[1, 0, 0, 0, 1, 0, 1, 1, 1] 

...和你的RLE編碼的比特組將是:

013113 

...被解釋爲「0零,1個1,3個零,1個1等」。

您可以選擇將RLE編碼的字符串保存爲字符或使用二進制格式。

3
new ObjectOutputStream(new FileOutputStream("s")).writeObject(new ArrayList()); 

保存文件。

+0

顯然你應該實現它比這更好一點,但那就是它的要點。 – Nico 2009-10-01 18:37:22

1

這可能是一種矯枉過正,但您可能還想考慮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對象,並通過各集陣列方便地迭代。