3

我正在尝试开发一个简单的在线编辑器,允许实时协作(用 Java 编写)。在这个编辑器中,我希望客户能够在任意点编辑源代码(例如,将字母“d”添加到源代码文件的第 11 行第 20 列)。我不确定如何以有效的方式设计这些源代码文件对象,同时仍然允许逐个字母的客户端-服务器同步(类似于 Google Docs 的工作方式)。

我考虑过使用 RandomAccessFile,但在阅读了这篇文章后,我认为这不是一种有效的方法。在文件开头附近插入一个字母将涉及更改其后的所有内容。

我目前的计划是使用 StringBuilder 对象及其插入/删除/追加方法来表示服务器和客户端上的源文件。在服务器端,此 StringBuilder 将根据需要转换为实际文件。

我很好奇是否有更好的方法来解决这个问题。有任何想法吗?

4

2 回答 2

4

您将需要像Ropes这样的东西作为基本数据结构。这将启用 O(log n) 编辑、插入、追加、连接等,因此您无需担心在大型数据结构中间进行编辑。

需要考虑的两个开源库:

除此之外,您还需要构建用于合并和发布同步更改的逻辑。这实际上是棘手的部分:您需要决定解决冲突等的逻辑以及如何将“增量”传输给客户端。

我会将持久性/复制到永久存储视为一个单独的问题 - 最好首先让所有内容都与内存数据结构一起正常工作。然后,您可以定期将数据刷新到持久存储中。我建议像Git这样的东西,或者如果你特别喜欢冒险,你可以尝试像Datomic这样的东西(它本质上是一个像 Git 一样工作的数据库,并保留所有更新的历史记录)

于 2012-10-21T03:31:36.153 回答
0

也许更好的方法是使用像Git这样的分布式版本控制。用户保存存储库的本地副本,他们可以从远程拉取将在本地合并,提交将更改本地存储库并推送以更新远程。这意味着您将需要用户的权限才能将文档保存在他们的本地计算机上。

于 2012-10-21T03:23:13.023 回答