// 資料 Append 到檔案 Data.Json ConcurrentDictionary<int, Data> tempData = new ConcurrentDictionary<int, Data>(); ...(略) using (FileStream stream = new FileStream("Data.json", FileMode.Append)) { BinaryFormatter bformatter = new BinaryFormatter(); bformatter.Serialize(stream, tempData); }
然後等到有需要時,就用以下程式讀取 Data.Json 裡的資料出來:
// 載入Data.Json ConcurrentDictionary<int, Data> realData = new ConcurrentDictionary<int, Data>(); if (File.Exists("Data.json")) { using (FileStream stream = new FileStream("Data.json", FileMode.Open)) { BinaryFormatter bformatter = new BinaryFormatter(); realData = (ConcurrentDictionary<int, AccPullerData>)bformatter.Deserialize(stream); } }
但是讀取到的資料都只有前 60 筆,原來 FileStream 每次 Append 資料時,都屬於不同的 Position,而在 Read 時只會一次讀取一個 Position,所以以上的寫法只會取到第一個 Position。
需加上判斷是否已經讀到最後了才行,如下:
// 載入Data.Json ConcurrentDictionary<int, Data> realData = new ConcurrentDictionary<int, Data>(); if (File.Exists("Data.json")) { using (FileStream stream = new FileStream("Data.json", FileMode.Open)) { BinaryFormatter bformatter = new BinaryFormatter(); // 判斷是否已經讀到最後了 while (stream.Position != stream.Length) { var temp = (ConcurrentDictionary<int, Data>)(bformatter.Deserialize(stream)); foreach (var item in temp) realData.TryAdd(item.Key, item.Value); } } }
參考來源:stackOverflow