我正在尝试开发一个允许实时协作的简单在线编辑器(用Java编写)。在这个编辑器中,我希望客户能够在任意点编辑源代码(例如,将字母“d”添加到第11行第20列的源代码文件中)。我不确定如何以有效的方式设计这些源代码文件对象,同时仍允许逐个字母的客户端 - 服务器同步(类似于Google Docs的工作方式)。
我考虑使用RandomAccessFile,但在阅读this post后,我认为这不是一种有效的方法。在文件开头附近插入一个字母将涉及更改后面的所有内容。
我目前的计划是使用StringBuilder对象及其insert / delete / append方法表示服务器和客户端上的源文件。在服务器端,此StringBuilder将根据需要转换为实际文件。
我很好奇是否有更好的方法可以解决这个问题。有什么想法吗?
答案 0 :(得分:4)
您需要Ropes之类的基本数据结构。这将启用O(log n)编辑,插入,追加,连接等,因此您无需担心大型数据结构中的编辑。
要考虑的两个开源库:
除此之外,您还需要构建用于合并和发布同步更改的逻辑。这实际上是棘手的部分:你需要决定解决冲突的逻辑等,以及如何将“增量”传递给客户。
我会将持久性/复制永久存储视为一个单独的问题 - 最好先让内存数据结构的所有内容都能正常工作。然后,在周期性点,您可以将数据刷新到持久存储。我建议像Git这样的东西,或者如果你特别喜欢冒险,你可以尝试像Datomic这样的东西(它本质上是一个像Git一样工作的数据库,并保存所有更新的历史记录)
答案 1 :(得分:0)
也许更好的方法是使用分布式版本控制,就像Git一样。 用户保存存储库的本地副本,他们可以从远程提取,这将在本地合并,提交将更改本地存储库并推送更新远程。 这意味着您将需要用户的权限才能在本地计算机上保存文档。