定期保存从文件中读取的HashMap

时间:2014-05-01 08:01:20

标签: java hashmap filewriter

大家好,我还在编写服务器端应用程序的自学教程,我正在为我计划的iOS应用程序草拟草稿。

我打算做的是让应用程序提交和请求值基本上等于HashMap不同的键和值,其确切行为不是必须解释的。

显然,要在应用程序的运行实例中维护存储的服务器数据(即重新启动,添加更多计算机等),我打算使用FileWriterHashMap保存到文件中。想法是,当首次运行服务器应用程序时,它会将已保存的HashMap拉入到"工作存储"的实例中。

你们是否有关于如何实施设置的想法,该设置将定期(每1到10秒,假设)保存文件以制作"工作示例"和文件同步(以防止由于停电,程序失败,上帝的行为等导致的数据丢失)。

我查了FileWriter的参考文献,但看不到列出的内容。我绝对更喜欢使用比每秒覆盖,销毁和重新打开文件更复杂的方法。

警惕的话 - 我是Java新手。我可以用核心语言保留自己的语言,但是我不会拥有存在的所有不同类和接口的大量内置内存。详细的描述会让我更开心。

2 个答案:

答案 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的访问以避免损坏。我还建议写一个新文件,只在成功写入时删除旧文件。这可以避免在写入时发生故障时丢失数据。