大家好,我还在编写服务器端应用程序的自学教程,我正在为我计划的iOS应用程序草拟草稿。
我打算做的是让应用程序提交和请求值基本上等于HashMap
不同的键和值,其确切行为不是必须解释的。
显然,要在应用程序的运行实例中维护存储的服务器数据(即重新启动,添加更多计算机等),我打算使用FileWriter
将HashMap
保存到文件中。想法是,当首次运行服务器应用程序时,它会将已保存的HashMap
拉入到"工作存储"的实例中。
你们是否有关于如何实施设置的想法,该设置将定期(每1到10秒,假设)保存文件以制作"工作示例"和文件同步(以防止由于停电,程序失败,上帝的行为等导致的数据丢失)。
我查了FileWriter
的参考文献,但看不到列出的内容。我绝对更喜欢使用比每秒覆盖,销毁和重新打开文件更复杂的方法。
警惕的话 - 我是Java新手位。我可以用核心语言保留自己的语言,但是我不会拥有存在的所有不同类和接口的大量内置内存。详细的描述会让我更开心。
答案 0 :(得分:0)
您可以做的一件事是让自动保存机制存在于定期唤醒的不同线程中,并使用HashMap
写入FileWriter
。您可以这样做的一种方法是创建一个扩展Runnable
的内部类,并具有一个指向您要编写的HashMap
的实例变量。
所以也许是这样的:
class AutoSaver implements Runnable {
private final HashMap<?, ?> mapToSave;
private final FileWriter writer;
public AutoSaver(HashMap<?, ?> mapToSave) {
this.mapToSave = mapToSave;
// initialize FileWriter
}
@Override
public void run() {
// write HashMap
Thread.sleep(interval);
}
}
然后启动它:
new Thread(new AutoSaver(mapToSave)).start();
你必须要小心这一点,因为当多个线程访问同一个对象时,你现在必须处理并发问题。解决此问题的一种方法是使用ConcurrentHashMap
而不是普通HashMap
。
答案 1 :(得分:0)
除非您只撰写文字,否则不要使用FileWriter。
如果没有更多信息,我建议使用XMLEncoder。这比二进制格式更有优势,您可以阅读甚至修改内容。如果您不喜欢XML,我建议使用YAML,例如: snakeyaml,这有一个更好的格式。
您必须锁定对HashMap的访问以避免损坏。我还建议写一个新文件,只在成功写入时删除旧文件。这可以避免在写入时发生故障时丢失数据。