1

我目前正在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 的一些建议解决了这个问题。你可以在这里看到它,如果你知道更好的解决方案,请贡献!

4

1 回答 1

1

看起来您需要文件中表示的数组 - 否则我建议通过简单地附加来创建多个独立记录。在这里,我建议使用RandomAccessFile,用逗号替换右括号,附加新记录和右括号。

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

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


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

于 2012-08-27T16:12:27.683 回答