2012-03-16 164 views
0

我正在創建一個桌面Java應用程序,它需要存儲(可能會變成)合理大量的數據。我最初想到了我自己的格式:什麼是存儲這些數據的最佳方式?

id;name;value,value,value... 
id;name;value,value,value... 

要作爲純文本存儲和隨機讀取/寫入。我最初的想法是使用RandomAccessFile;但是,當我插入任意位置時,我遇到了數據被覆蓋的問題。

使用現有的數據轉移,臨時存儲,恢復等方法似乎是一個不好的解決方案,特別是因爲我打算經常讀/寫,所以它會變得昂貴。我已經讀過,這是底層操作系統的限制,而不是Java本身。

對於頻繁訪問和寫入,整齊存儲這些數據的最佳方法是什麼?使用SQLite跨越了我的想法。我也想過爲每個ID /名稱創建一個文件,因爲數據值只會被添加到每個文件的末尾,因此不會覆蓋任何內容。

+1

這是數據庫是爲製作。試圖處理文件讀取/寫入會非常緩慢,如果您需要搜索文件,您將獲得巨大的性能提升。如果將這些數據存儲在數據庫中,則可以通過id/name訪問,而不必擔心文件訪問。 – jzworkman 2012-03-16 17:55:55

+0

定義「相當經常」。不知道更多關於數據的信息(它是關係型的嗎?平坦的?只有和永遠的關鍵/價值?多少數據?你需要怎麼搜索?等等)很難提供有意義的建議。在這一點上看起來更像是一個關鍵/值數據庫而不是文件。 – 2012-03-16 17:57:33

回答

2

很容易使用數據庫來解決這個問題。你不需要一個完整的數據庫。最好使用嵌入式數據庫。

使用JVM嵌入式數據庫如apache derbyberkely-db

+0

這是我想到的想法,這就是爲什麼我認爲SQLite,所以它是獨立的。我會看看,謝謝:) – c24w 2012-03-16 18:13:39

+1

@ c24w,imho,apache derby或HSQL db更適合java。另請參閱[本討論](http://stackoverflow.com/questions/41233/java-and-sqlite) – 2012-03-19 00:52:14

0

我會嘗試使用數據庫。數據庫被創建用於存儲數據。它們非常易於使用,而且非常簡單。我喜歡使用MySQL。這對數據庫非常有用。

+0

根據原始問題,他已經在考慮一個數據庫(SQLite)。在桌面環境中,獨立的MySQL幾乎可以肯定對於像這樣的相對簡單的模式來說太重了(建議使用像嵌入數據庫一樣的嵌入數據庫)。 – mjk 2012-12-31 16:10:28

1

使用數據庫將是最建議的方法。我會告訴你一個可選的方式,讓你或未來的讀者想要輕鬆存儲中等大小的數據以便快速訪問。根據需要調整異常處理。

public class PersistentMap extends HashMap<String, Object> implements Serializable { 
    private static final long serialVersionUID = 0x42424242; 
    private File file; 
    protected PersistentMap(File file) throws Exception { 
     this.file = file; 
     if (file==null || file.isDirectory()) { 
      throw new RuntimeException("ProgramCheck: "+file); 
     } 
     if (!file.exists()) { 
      if (file.getParent()!=null) { 
       new File(file.getParent()).mkdirs(); 
      } 
      save(); 
     } 
     restore(); 
    } 
    public void save() throws Exception { 
     FileOutputStream fos = new FileOutputStream(file); 
     ObjectOutputStream oos = new ObjectOutputStream(fos); 
     oos.writeObject(this); 
     oos.close(); 
     fos.close(); 
    } 
    public void restore() throws Exception { 
     FileInputStream fis = new FileInputStream(file); 
     ObjectInputStream ois = new ObjectInputStream(fis); 
     super.putAll((Map<String,Object>)ois.readObject()); 
     ois.close(); 
     fis.close(); 
    } 
} 

用法:

PersistentMap map = new PersistentMap(new File("myData\\data")); 
System.out.println(" "+map); 
map.put("yoyo","mama"); 
map.save(); 
System.out.println(" "+map); 

輸出第1趟:

{} 
{yoyo=mama} 

輸出第N運行:

{yoyo=mama} 
{yoyo=mama} 
+0

感謝您的貢獻。之前我做過類似的事情,但對於不需要頻繁讀取/寫入的數據 - 在添加很多小數據(爲了防止數據丟失)之後調用save會不太昂貴? – c24w 2012-03-16 19:00:18

+1

就CPU%或文件I/O而言,我認爲命中率很低。真正的命中是所有數據都在內存中(這就是爲什麼它如此之快)。添加一個JVM關閉鉤子來做最後的保存,你將需要更少的檢查點保存。 – Java42 2012-03-16 19:07:52

相關問題