1

我很想知道如何在Java中編寫一個可以自動同步文件(桌面,筆記本,智能手機)的文件的應用程序。與Dropbox類似,但沒有第三方服務器,因爲我擁有自己的服務器。文件/目錄同步算法

通過網絡搜索我還沒有找到任何有用的話題談論這些程序中使用的同步算法。考慮到這個問題與版本控制相似,我想這不是一個容易的主題。因爲我想放鬆它。例如。我還沒有(現在)希望在數據傳輸中實現文件更改的優化,所以如果它改變了,我就可以傳輸整個文件。如果系統要求我在不同文件版本之間手動解決衝突,那麼對我來說也很好。

我最大的問題是網絡通信。從機客戶端應該如何詢問/告訴我的中央存儲服務器文件更改?我想定期傳輸帶有元數據的整個文件列表到服務器並不是一個好主意。據我看到,Dropbox在啓動時檢查整個共享文件夾,然後以某種方式注意到本地文件系統上的更改(我知道有一種方法可以監聽操作系統中的文件系統更改事件,例如,Java7擁有WatchService類)收聽網絡同步事件。我是否應該維護像版本控制系統這樣的文件修訂版或者是否有其他解決方案?

是否有任何關於此主題的書籍或在線資料?

回答

1

我的第一個想法是rsync。有的Java實現..它可能會奏效,但它不再發展:JarSync

rsync的算法傳輸文件的三角洲,這樣你就不會招致傳輸整個文件的帶寬命中。如果您使用的是Linux,則可能更容易從命令行執行本地rsync客戶端。

WatchService是一個不錯的實用程序,用於監視更改。我相信它會嵌入到操作系統本地文件更改事件中,而不是一些過去幾年中必須使用的簡單輪詢機制​​。

如果你想支持版本控制,也許你應該看看像SVN的東西? SVNKit可能是最好的java svn客戶端。我不確定SVN是否會轉移增量。 (我對此表示懷疑)。也許你可以考慮使用Git來代替。我知道它傳遞了三角洲。這是一個日食項目Git client

祝你好運!

+0

鑑於SVN _stores_ deltas,我會想象它將它們轉移。 –

+0

嗯,我正在與SVN很多,所以也許這將是最好的選擇。但是我擔心我理解SVN的內部機制有點矯枉過正。我會試一試。我不知道SVNKit是SVN的純Java實現,我認爲它只是本地二進制文件的包裝。 rsync不是例如。 Android系統。它也是用C編寫的,我在C語言中不太流利,很好地理解每一點。 – NagyI

+0

@ X-Zero,你是對的。它確實根據SVN書籍轉移增量。我不確定,因爲它似乎比Git慢得多:-P。 –

0

也許你只需要爲每個文件保留一個時間戳。如果發生了變化,請上傳文件(或者在上傳之前查看是否已更改)

如果您的項目不需要純Java,那麼也可以考慮利用rsync來執行此操作。

+0

rsync最大的問題是它可能無法在手機上運行(比如說Android)。比較時間戳是一個簡約的方法 - 我也想過了。 – NagyI