使用现有JSON数据将对象添加到文件

时间:2012-08-27 15:50:12

标签: android json gson

我正在尝试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,如果您知道更好的解决方案,我们会做出贡献!

1 个答案:

答案 0 :(得分:1)

看起来你需要文件中表示的数组 - 否则我建议只需附加就可以创建多个独立的记录。在这里,我建议使用RandomAccessFile,用逗号替换右括号,附加新记录和结束括号。

假设您使用了一些理智的编码 1 ,括号映射到单个字节(93),因此通过从文件末尾开始的简单循环来查找它应该是相当简单的。如果没有其他人写入该文件,您甚至可以假设它是最后一个字节......

1 你呢?不,您使用依赖于平台的编码,因为您未指定FileWriter构造函数的编码。使用平台相关编码的恕我直言永远不会理智,所有相应的方法都应该被弃用,但这只是我的看法。


如果单个对象(而不是它们的数组)就足够了,我建议写入每个对象的长度(例如,使用DataOutputStream),然后输入,这样你就可以快速而简单地跳转超过它。或者甚至更好,编写一个包含记录长度的单独索引文件(例如,以二进制形式或每行一个数字字符串)。