我有一个HashMap,它在json文件的静态块中初始化过一次。然后,我使用本地HashMap来保存用户请求。
static {
TypeFactory typeFactory = mapper.getTypeFactory();
MapType mapType = typeFactory.constructMapType(ConcurrentHashMap.class, String.class, GooglePlayGame.class);
try {
games = mapper.readValue(new File("games.json"), mapType);
} catch (IOException e) {
log.error(e.getMessage());
}
}
[当我决定停止应用并再次启动它时,我可以在地图上添加新的一对“键值”,但是当我尝试将更改附加到json文件中时,json文件中已经存在的所有内容重复+新值。此代码:
try(JsonGenerator g = mapper.getFactory().createGenerator(
new PrintWriter(new BufferedWriter(new FileWriter(new File("games.json"), true))))) {
mapper.writeValue(g, games);
} catch (IOException e) {
log.error(e.getMessage());
}
我理解了为什么会这样(因为每次新启动都会进行静态初始化,然后我一次又一次地写入所有哈希图的文件),但是我不知道如何解决这个问题。我想将新对添加到现有的json文件中。
例如:添加第一个请求,一切正常:
{"Machinarium":
{"Title":"Machinarium",
"Updated":"28 February, 2019",
"Version":"2.5.6","Requirements":"4.1,
"Contacts":"[email protected]"
}
然后我重新启动应用程序并收到另一个请求,我的json文件现在看起来像:
{"Machinarium":
{"Title":"Machinarium",
"Updated":"28 February, 2019",
"Version":"2.5.6","Requirements":"4.1,
"Contacts":"[email protected]",
....
},
{"Machinarium":
{"Title":"Machinarium",
"Updated":"28 February, 2019",
"Version":"2.5.6","Requirements":"4.1,
"Contacts":"[email protected]",
....
},
"Samorost 3":
{"Title":"Samorost 3",
"Updated":"November 14, 2019",
"Version":"1.0",
"Requirements":"4.3,
...}
如您所见,此处重复。
所以目标是:创建HashMap->获取用户请求->将此请求(“键-值”对)写入本地hashmap->将hashmap(或每对分别为hmm)写入json文件。然后,当应用再次启动时:使用保存的请求从此json文件初始化哈希图->获取新的用户请求->将新请求添加到json文件。
所以,我需要一对一地写入文件(不是全部地图),但是如何?
最终,您的问题在这里:new FileWriter(new File("games.json"), true))
。
FileWriter
构造函数为FileWriter(File file, boolean append)
,因此您每次写入时都会将数据追加到该文件。
您想要的只是FileWriter(File file)
,默认情况下会覆盖该文件。假设您的games
映射始终是最新的,并且所有数据都在内存中。
这有点低效率,因为每次进行更改时都会覆盖整个文件,但这似乎不是很多数据,所以我认为这不是要担心的问题。如果事实证明这是经常更新的大量数据,则您可能希望研究使用数据库而不是JSON文件。