存储此数据的最佳方法是什么?

时间:2012-03-16 17:53:12

标签: java io storage

我正在创建一个桌面Java应用程序,它需要存储(可能会变成)相当大量的数据。我最初想到了我自己的格式:

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

以纯文本形式存储并随机读/写。我最初的想法是使用RandomAccessFile;但是,当插入任意位置时,我遇到了数据被覆盖的问题。

使用移动现有数据的方法,临时存储它,恢复它等等,似乎是一个糟糕的解决方案,特别是因为我打算经常读/写,所以它会变得昂贵。我已经读过这是底层操作系统的限制,而不是Java本身。

为频繁访问和写入整齐地存储此类数据的最佳方法是什么?使用SQLite克服了我的想法。我还想过可能每个id / name创建一个文件,因为数据值只会附加到每个文件的末尾,因此不会覆盖任何内容。

3 个答案:

答案 0 :(得分:2)

使用数据库来解决这个问题很容易。您不需要完整的数据库。最好使用嵌入式数据库。

使用jvm嵌入式数据库,例如apache derbyberkely-db

答案 1 :(得分: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}

输出第N次运行:

 {yoyo=mama}
 {yoyo=mama}

答案 2 :(得分:0)

我会尝试使用数据库。创建数据库用于存储数据。它们非常易于使用,而且非常简单。我喜欢使用MySQL。这对数据库非常有用。