我計劃將一個數組數組存儲在文件中,並在需要時讀取它。什麼是這樣做的好方法?我可以想到很多方法,比如將每個元素作爲文本文件存儲在一行中,或者將其序列化並通過該方法存儲/調用。速度是我首先關心的問題。將數組存儲在java中的文件中
感謝
我計劃將一個數組數組存儲在文件中,並在需要時讀取它。什麼是這樣做的好方法?我可以想到很多方法,比如將每個元素作爲文本文件存儲在一行中,或者將其序列化並通過該方法存儲/調用。速度是我首先關心的問題。將數組存儲在java中的文件中
感謝
如果該文件並不需要是人類可讀的,則其序列將是更好的辦法性能明智的。 如果您要將每個數組條目保存爲文件中的一行,您需要遍歷數組, 做一些IO,保存文件,稍後將其恢復爲完全相同的數組,您需要完成所有步驟相反。此外,IO操作相當昂貴。
內置的序列化機制爲您做了所有這些工作,並且可以以最有效的方式進行。
在這方面的速度是次要問題。爲什麼?因爲你正在讀文件無論如何和I/O是慢(與內存操作相比)。我只是將它們每行存儲一個數字,以便它可讀。
如果你只想存儲一個數字數組,然後編寫你自己的手動序列化/反序列化例程將工作。它會教你一些關於IO操作的東西。
當你遇到更復雜的類型 - 字符串,甚至 - 然後使用內置的序列化方法從長遠來看可能會更好地爲你服務,因爲它們通常對絕大多數用例來說更可靠。
儘管我不是Java開發人員,但在Java中使用序列化看起來相當簡單。 Sun似乎對Java序列化有了很好的介紹。
http://java.sun.com/developer/technicalArticles/Programming/serialization/
沒有對你的使用情況,以瞭解最佳的進場速度明智的足夠信息。 (這是多線程的,多久會這樣做,數組的大小和這樣的問題)。
這就是說,唯一真正知道的方法就是分析它們。序列化是微不足道的,每行寫一個數字也很簡單,所以你可以嘗試這兩個,根據你需要的場景類型來描述它們,查看哪一個更快,看看它們中的任何一個是否達到你的性能目標。
如果速度是您主要關心的問題,請使用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進行批量操作。
二進制形式的優點是:
一種新穎的方法:如果你的數組數組是唯一的整數,你可以把它們寫成一個遊程長度編碼的「位集」。這將提供非常緊湊的表示,意味着更少的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編碼的字符串保存爲字符或使用二進制格式。
new ObjectOutputStream(new FileOutputStream("s")).writeObject(new ArrayList());
保存文件。
顯然你應該實現它比這更好一點,但那就是它的要點。 – Nico 2009-10-01 18:37:22
這可能是一種矯枉過正,但您可能還想考慮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對象,並通過各集陣列方便地迭代。
對於基於文本的存儲有很多需要說的。如果存儲是一個問題,你總是可以壓縮它。 – SteveD 2009-10-01 14:45:42