Java - 如何在文件中存储(多子)树?
Java - how to store a (multi-child) tree in file?
我正在研究 open-source, cross-platform 具有统计支持的番茄钟。
对于任务,我有一个像这样的树数据结构:
class Task {
String name;
int minutesWorkedOn;
int uniqueID;
Task parent;
...
ArrayList<Task> childTasks; //Note, not binary, but can have n-children.
}
(实际上是bit bigger)
我想在会话之间将此数据结构存储在一个文件中。
我正在考虑 JSON 或 xml,并递归 childTasks,或者写出所有任务,每行一个任务,然后通过 taskID 将事情拼凑起来。但是 JSON/XML 不是硬性要求,我只是在大声思考。
一些 S.O 答案提到了序列化,但我希望能够像 JSON 或 XML 那样看到存储的数据结构。此外,这两种格式将使构建报告工具变得更加容易。
考虑到我是 java 的新手并且之前没有使用过 File/I/O,有人可以给我一个 tip/advise 来这里走哪条路线吗?
[编辑]
下面的解决方案效果很好。你的循环有问题。我编辑了上面的代码,一个任务有一个向后 link 到它的父级。这会导致 gson 崩溃。我可能会忽略此字段并在加载数据后再次修复它,或者阅读更多有关教程的内容。
最好和最简单的方法是使用 Gson 将对象 write/read 写入文件。
写入:
//Get the json serialization of the task object
GsonBuilder builder = new GsonBuilder();
//builder.setPrettyPrinting().serializeNulls(); //optional
Gson gson = builder.create();
String json = gson.toJson(task);
try {
//write json string to a file named "/tmp/task.json"
FileWriter writer = new FileWriter("/tmp/task.json");
writer.write(json);
writer.close();
} catch (IOException e) {e.printStackTrace();}
阅读:
Gson gson = new Gson();
try {
BufferedReader br = new BufferedReader(new FileReader("/tmp/task.json"));
//convert the json string from file back to object
Task task = gson.fromJson(br, Task.class);
} catch (IOException e) {
e.printStackTrace();
}
我正在研究 open-source, cross-platform 具有统计支持的番茄钟。
对于任务,我有一个像这样的树数据结构:
class Task {
String name;
int minutesWorkedOn;
int uniqueID;
Task parent;
...
ArrayList<Task> childTasks; //Note, not binary, but can have n-children.
}
(实际上是bit bigger)
我想在会话之间将此数据结构存储在一个文件中。 我正在考虑 JSON 或 xml,并递归 childTasks,或者写出所有任务,每行一个任务,然后通过 taskID 将事情拼凑起来。但是 JSON/XML 不是硬性要求,我只是在大声思考。
一些 S.O 答案提到了序列化,但我希望能够像 JSON 或 XML 那样看到存储的数据结构。此外,这两种格式将使构建报告工具变得更加容易。
考虑到我是 java 的新手并且之前没有使用过 File/I/O,有人可以给我一个 tip/advise 来这里走哪条路线吗?
[编辑]
下面的解决方案效果很好。你的循环有问题。我编辑了上面的代码,一个任务有一个向后 link 到它的父级。这会导致 gson 崩溃。我可能会忽略此字段并在加载数据后再次修复它,或者阅读更多有关教程的内容。
最好和最简单的方法是使用 Gson 将对象 write/read 写入文件。
写入:
//Get the json serialization of the task object
GsonBuilder builder = new GsonBuilder();
//builder.setPrettyPrinting().serializeNulls(); //optional
Gson gson = builder.create();
String json = gson.toJson(task);
try {
//write json string to a file named "/tmp/task.json"
FileWriter writer = new FileWriter("/tmp/task.json");
writer.write(json);
writer.close();
} catch (IOException e) {e.printStackTrace();}
阅读:
Gson gson = new Gson();
try {
BufferedReader br = new BufferedReader(new FileReader("/tmp/task.json"));
//convert the json string from file back to object
Task task = gson.fromJson(br, Task.class);
} catch (IOException e) {
e.printStackTrace();
}