0

我有 2 个哈希图,我希望在单击菜单按钮时都保存它们,并且我希望能够加载它们(在示例中我只保存一个)。

void saveHash(HashMap<String, Object> hash, HashMap<String, Object> logicalMatrix2) {
    JFrame parentFrame = new JFrame();

    JFileChooser fileChooser = new JFileChooser();
    fileChooser.setDialogTitle("Especifique um diretório:");
    fileChooser.setAcceptAllFileFilterUsed(false);

    int userSelection = fileChooser.showSaveDialog(parentFrame);

    if (userSelection == JFileChooser.APPROVE_OPTION) {
        File fileToSave = new File(fileChooser.getSelectedFile() + ".alg");
        Set<Entry<String, Object>> entry = hash.entrySet();
        FileWriter outFile;
        try {
            outFile = new FileWriter(fileToSave.getAbsolutePath());
            PrintWriter out = new PrintWriter(outFile);
            out.println(entry);
            out.close();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }   
    }
}

有了这个,我可以将 entrySet() 保存在一个 txt 文件中,但是我不知道如何重新加载这个内容。该软件将从空的 HashMap 开始,然后,通过加载过程,我希望能够相应地填充键及其各自的值。但是,考虑到它保存在一个 txt 文件中,我如何通过它运行“读取循环”来识别未知键?当我们考虑到每个键的值都是一个 ArrayList 时,问题就变得更加复杂了。

非常感谢!

4

2 回答 2

2

可能最简单的方法是使用ObjectOutputStream而不是 PrintWriter,您可以使用ObjectInputStream读取结果。
这是假设您的 HashMap 中包含的对象是SerializableExternalizable
我只会序列化 HashMap 本身而不是 entrySet。使用对象序列化时有许多注意事项(版本控制、瞬态对象、枚举常量等),因此我建议您阅读有关主题的内容

如果您需要在 Java 环境之外读取文件或希望它们是人类可读的,XMLEncoderXMLDecoder可能允许更多的可移植性。

于 2013-05-14T23:42:46.723 回答
0

除了使用其他人提到的序列化之外,另一种探索途径是使用 JSON 作为持久格式。您可以使用Gson来完成此操作。

于 2013-05-15T01:43:28.227 回答