使用 Java 将嵌套地图保存并加载到文本文件中

Posted

技术标签:

【中文标题】使用 Java 将嵌套地图保存并加载到文本文件中【英文标题】:Save and Load nested Map into text file using Java 【发布时间】:2015-01-12 08:59:15 【问题描述】:

我有一个嵌套的 MAP。我想将这些地图保存在一个文本文件中,然后在另一个项目中使用这个文件。我可以正确保存outerMap,但是我需要一个高效的代码来将此文件加载到相同的地图中(我使用'#'来分隔outerMap的键和它的innerMap)。

Map <String, Map <String,Double>> outerMap= new HashMap<>();
Map <String,Double> innerMap= new HashMap<>();
   .
   .
   .

PrintWriter writer = new PrintWriter("e:\\t.txt", "UTF-8");
Iterator it = outerMap.entrySet().iterator();
while (it.hasNext()) 
       Map.Entry pairs = (Map.Entry)it.next();
       writer.println(pairs.getKey() + "#" + pairs.getValue());

writer.close();

【问题讨论】:

您需要文件可读吗?使用ObjectOutputStream 我可以将 Map 转换为 JSON 格式。将其保存到文本文件中。稍后恢复地图将是一种简单的方法。 @epoch,谢谢,该文件的内容没有改变,事实上我需要将该文件读入我的嵌套地图。 @Dmitry Tsechoev,你有保存和加载嵌套地图到 JSON 的代码吗? @Masoud,给我一些时间。我会写代码。在我的第一条评论中必须是“你可以”而不是“我可以”。 【参考方案1】:

关于你在评论中的问题:

Gson gson = new Gson();

Map<String, Map<String, Double>> outerMap = new HashMap<>();

Map<String, Double> innerMap = new HashMap<>();
innerMap.put("1", 1.0);
innerMap.put("2", 2.0);

outerMap.put("key1", innerMap);

String json = gson.toJson(outerMap);

Path path = FileSystems.getDefault().getPath("", "myfile.txt");
Files.write(path, json.getBytes("UTF-8"), StandardOpenOption.CREATE, StandardOpenOption.WRITE, StandardOpenOption.TRUNCATE_EXISTING);

json = new String(Files.readAllBytes(path));

outerMap = gson.fromJson(json, new TypeToken<Map<String, Map<String, Double>>>().getType());

for (Map.Entry<String, Map<String, Double>> outerEntry: outerMap.entrySet()) 
    System.out.println(outerEntry.getKey());
    innerMap = outerEntry.getValue();

    for (Map.Entry<String, Double> innerEntry: innerMap.entrySet()) 
        System.out.println("    " + innerEntry.getKey() + "->" + innerEntry.getValue());
    

输出:

键1 2->2.0 1->1.0

您需要使用Gson 库。

如果您不需要文本文件中的人类可读内容,您可以使用第一条评论中建议的方法:

Map<String, Map<String, Double>> outerMap = new HashMap<>();

Map<String, Double> innerMap = new HashMap<>();
innerMap.put("1", 1.0);
innerMap.put("2", 2.0);

outerMap.put("key1", innerMap);

// write to file

try (ObjectOutput objectOutputStream = new ObjectOutputStream(new BufferedOutputStream(new FileOutputStream("myfile2.txt", false)))) 
    objectOutputStream.writeObject(outerMap);
 catch (Throwable cause) 
    cause.printStackTrace();


// read from file

try (ObjectInput objectInputStream = new ObjectInputStream(new BufferedInputStream(new FileInputStream("myfile2.txt")))) 
    outerMap = (Map<String, Map<String, Double>>) objectInputStream.readObject();
 catch (Throwable cause) 
    cause.printStackTrace();

您将在“outerMap”参考上获得您的地图。

【讨论】:

【参考方案2】:

这对我来说听起来很简单。

(假设您要将文件的值加载到 innerMap 中)

FileInputStream inputStream = new FileInputStream("e:\\t.txt");
BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));

String buffer;
while((buffer = reader.readLine()) != null)
    String[] pairs = buffer.split("#");
    innerMap.put(pairs[0],Double.parseDouble(pairs[1]));

在您认为必要的地方进行安全检查。

注意:示例代码是盲目编写的,可能会出现粗心的错误。

【讨论】:

谢谢,但您的代码有错误:“ouble 无法转换 tp Map @Masoud 那是因为您试图将双精度放在 Map&lt;String,Double&gt; 应该在的位置。如果您的innerMap 对象是Map&lt;String,Double&gt;,那么这将起作用,如果您的innerMap 对象是Map&lt;String,Map&lt;String,Double&gt;&gt;,那么您将不得不自己嵌套它们。我的示例中的pairs[0] 是您示例中的pairs.getKey(),我的示例中的pairs[1] 是您示例中的pairs.getValue()

以上是关于使用 Java 将嵌套地图保存并加载到文本文件中的主要内容,如果未能解决你的问题,请参考以下文章

将任何文件加载到位并保存

如何将 RichTextBox 文本保存到文本资源文件?

将数据从 .txt 保存并加载到正确的 texbox

将抽象数据类型保存和加载到 json 文件并从游戏中的文件中读取 Haskell

使用嵌套地图检索数据并将其保存到 Firebase - Flutter [关闭]

Java:将对象保存在文本文件中?有现成的解决方案吗?