2012-10-21 42 views
3

我試圖開發一個簡單的在線編輯器,允許實時協作(用Java編寫)。在此編輯器中,我希望客戶端能夠在任意點編輯源代碼(例如,將字母'd'添加到位於第11行第20列的源代碼文件中)。我不確定如何以有效的方式設計這些源代碼文件對象,同時仍然允許按字母順序的客戶端 - 服務器同步(類似於Google文檔的工作原理)。針對在任意位置編輯的基於文本文件的高效設計?

我考慮使用RandomAccessFile,但在閱讀this post後,我認爲這不是一種有效的方法。在文件的開頭附近插入一個字母會涉及改變它後面的所有內容。

我目前的計劃是使用StringBuilder對象及其insert/delete/append方法來表示服務器和客戶端上的源文件。在服務器端,該StringBuilder將根據需要轉換爲實際文件。

我很好奇是否有更好的方法來解決這個問題。有任何想法嗎?

+0

您可以使用內存塊數據那就是文件(備份不會鬆散數據),然後每隔一段時間將其寫回文件(可能帶有用於回滾的修訂擴展)。 – breezee

回答

4

您將需要像Ropes這樣的基本數據結構。這將啓用O(log n)編輯,插入,附加,連接等操作,因此您不必擔心在大型數據結構中進行編輯。

兩個開放源代碼庫來考慮:

在此之上,你將需要構建用於合併和發佈同步更改的邏輯。這實際上是一個棘手的部分:您需要決定解決衝突等的邏輯以及如何將「deltas」傳送給客戶端。

我會將持久性/複製作爲一個單獨的問題看待 - 最好先使內存中的數據結構正常工作。然後,在週期性點,您可以將數據刷新到持久性存儲。我建議類似Git,或者如果你特別喜歡冒險,你可以嘗試類似Datomic(這實質上是一個像Git一樣工作的數據庫,並保留所有更新的歷史記錄)

+0

聽起來像我一直在尋找。從來不知道繩索/繩索,所以謝謝。 – jtan

+0

現在用於管理更改的計劃是讓客戶端的所有任務(插入/刪除/ etc)通過服務器上的單線程ExecutorService。在服務器處理完任務之後,它將並行分配結果(使用多線程ExecutorService)給不同的客戶端。我希望設計的效率足以防止客戶明顯滯後。 此外,我們實際上正在計劃將Git用於持久存儲(儘管Datomic聽起來很酷)。 – jtan

0

也許更好的方法是使用分佈式版本控制,就像Git一樣。 用戶保存版本庫的本地副本,並且它們可以從遠程獲取,這將在本地合併,提交將更改本地存儲庫並推送到遠程更新。 這意味着您將需要用戶將文檔保存在其本地計算機上的權限。

+1

Git很棒,但這種使用模式並不適合這個問題中提出的「在線編輯器」的要求。 – mikera