2012-03-16 3 views
0

Я создаю настольное приложение Java, которое должно хранить (что может стать) достаточно большими объемами данных. Я изначально придумал свой собственный формат:Каковы наилучшие способы хранения этих данных?

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

Хранить как обычный текст и читать/писать произвольно. Мои первоначальные мысли заключались в использовании RandomAccessFile; однако я столкнулся с проблемой перезаписи данных при вставке в произвольные позиции.

Использование метода смещения существующих данных, их временного хранения, восстановления и т. Д., Кажется плохим решением, особенно потому, что я намерен читать/писать довольно часто, поэтому он станет дорогим. Я читал, что это ограничение основной ОС, а не самой Java.

Что было бы лучшим способом аккуратно хранить такие данные для частого доступа и записи? Использование SQLite перешло мне в голову. Я также думал о том, что возможно создать один файл для каждого id/name, так как значения данных будут добавляться только к концу для каждого, поэтому ничто не будет перезаписано.

+1

Это то, что базы данных были сделаны для. Пытаться обработать чтение/запись файлов будет очень медленным, и вы получите огромные удары производительности, если вам нужно искать файл. Если вы храните их в базе данных, вы можете получить доступ по id/name и не беспокоиться о доступе к файлу. – jzworkman

+0

Определите «довольно часто». Не зная больше о данных (это реляционный? Плоский? Только и всегда ключ/значение (ы)? Сколько данных? Как вам нужно искать? И т. Д.), Трудно дать содержательный совет. На данный момент больше похоже на БД ключа/значения больше, чем файлов (ов). –

ответ

2

Простая в использовании база данных для решения этой проблемы. Вам не нужна полноценная база данных. Лучше использовать встроенную базу данных.

Используйте Jvm встроенную базу данных, такие как apache derby или berkely-db

+0

Это идея, которую я имел в виду, поэтому я и подумал о SQLite, так что она самодостаточна. Я посмотрю, спасибо :) – c24w

+1

@ c24w, imho, apache derby или HSQL db лучше подходят для java. Также см. [Это обсуждение] (http://stackoverflow.com/questions/41233/java-and-sqlite) –

0

Я бы попытался использовать базу данных. Базы данных создаются для хранения данных. Они очень просты в использовании, и они очень просты. Мне нравится использовать MySQL. Это действительно хорошо для баз данных.

+0

По первому вопросу, он уже рассматривал базу данных (SQLite). Автономный MySQL почти наверняка слишком тяжеловес для относительно простой схемы, подобной этой, в контексте рабочего стола (лучше использовать встроенную базу данных, например, предлагаемый проводник @ring). – mjk

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); 

Выход первого запуска:

{} 
{yoyo=mama} 

Выходной Nth пробег:

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

Спасибо за ваш вклад. Я уже делал что-то похожее на это раньше, но для данных, которые не требуют частого чтения/записи, не будет ли дорогостоящим вызовом сохранять после многих небольших добавлений данных (чтобы предотвратить потерю данных)? – c24w

+1

С точки зрения CPU% или File I/O, я думаю, что хит минимален.Реальный хит - это все данные в памяти (поэтому он так быстро). Добавьте завершающий кусок JVM, чтобы выполнить окончательное сохранение, и вам потребуется меньше контрольных точек. – Java42

Смежные вопросы