我正在创建一个桌面Java应用程序,它需要存储(可能会变成)相当大量的数据。我最初想到了我自己的格式:
id;name;value,value,value...
id;name;value,value,value...
以纯文本形式存储并随机读/写。我最初的想法是使用RandomAccessFile;但是,当插入任意位置时,我遇到了数据被覆盖的问题。
使用移动现有数据的方法,临时存储它,恢复它等等,似乎是一个糟糕的解决方案,特别是因为我打算经常读/写,所以它会变得昂贵。我已经读过这是底层操作系统的限制,而不是Java本身。
为频繁访问和写入整齐地存储此类数据的最佳方法是什么?使用SQLite克服了我的想法。我还想过可能每个id / name创建一个文件,因为数据值只会附加到每个文件的末尾,因此不会覆盖任何内容。
答案 0 :(得分:2)
使用数据库来解决这个问题很容易。您不需要完整的数据库。最好使用嵌入式数据库。
使用jvm嵌入式数据库,例如apache derby或berkely-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。这对数据库非常有用。