使用 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 MapMap<String,Double>
应该在的位置。如果您的innerMap
对象是Map<String,Double>
,那么这将起作用,如果您的innerMap
对象是Map<String,Map<String,Double>>
,那么您将不得不自己嵌套它们。我的示例中的pairs[0]
是您示例中的pairs.getKey()
,我的示例中的pairs[1]
是您示例中的pairs.getValue()
。以上是关于使用 Java 将嵌套地图保存并加载到文本文件中的主要内容,如果未能解决你的问题,请参考以下文章
将抽象数据类型保存和加载到 json 文件并从游戏中的文件中读取 Haskell