我正在尝试Android中的一些东西,我正在尝试使用GSON将一些数据保存到JSON,并将新数据附加到同一个文件中。
假设这是第一次运行代码,数据被保存到名为 test.json 的文件中:
Gson gson = new GsonBuilder().setPrettyPrinting().create();
ArrayList<GSONObject> objects = new ArrayList<GSONObject>();
GSONObject obj = new GSONObject("sth", 1, 1345939200000);
objects.add(obj);
String json = gson.toJson(objects);
File file = new File(filePath + fileName);
FileWriter fileWriter = new FileWriter(file, true);
fileWriter.append(json);
fileWriter.close();
现在我将此保存到文件中:
[ {
"something": "sth",
"id": 1,
"time": 1345939200000
} ]
后来我想再次运行应用程序,但随后将一些新数据附加到同一个文件中,使其看起来像这样:
[ {
"sth": "sth",
"id": 1,
"time": 1345939200000
},
{
"sth": "sth2",
"id": 2,
"time": 1345939500000
} ]
我正在尝试保存此过程中使用的数据量和内存量,因此首先将文件解析到内存中然后将其写回文件是我宁愿避免的。
有什么建议吗?它真的不一定是GSON,只是运作良好的东西。
修改 我已经通过maaartinus的一些建议解决了这个问题。您可以看到它here,如果您知道更好的解决方案,我们会做出贡献!
答案 0 :(得分:1)
看起来你需要文件中表示的数组 - 否则我建议只需附加就可以创建多个独立的记录。在这里,我建议使用RandomAccessFile
,用逗号替换右括号,附加新记录和结束括号。
假设您使用了一些理智的编码 1 ,括号映射到单个字节(93),因此通过从文件末尾开始的简单循环来查找它应该是相当简单的。如果没有其他人写入该文件,您甚至可以假设它是最后一个字节......
1 你呢?不,您使用依赖于平台的编码,因为您未指定FileWriter
构造函数的编码。使用平台相关编码的恕我直言永远不会理智,所有相应的方法都应该被弃用,但这只是我的看法。
如果单个对象(而不是它们的数组)就足够了,我建议写入每个对象的长度(例如,使用DataOutputStream
),然后输入,这样你就可以快速而简单地跳转超过它。或者甚至更好,编写一个包含记录长度的单独索引文件(例如,以二进制形式或每行一个数字字符串)。