1

私のデバイス(デスクトップ、ノート、スマートフォン)間で自動的にファイルを同期できるJavaでアプリケーションを書くことについては疑問に思っています。 Dropboxと似ていますが、サードパーティ製のサーバがない場合は、自分で所有しているためです。ファイル/ディレクトリ同期アルゴリズム

ネットで検索すると、そのようなプログラムで使用されている同期アルゴリズムについての有益なトピックは見つかりませんでした。私は、この問題はリビジョン管理に似ているという事実を考慮すると、簡単な問題ではないと思います。そのため、私はそれをリラックスさせることを考えています。例えば。私は(まだ)ファイル内の変更のためのデータ転送で最適化を実装したくないので、変更されたファイル全体を転送することは大丈夫です。また、システムが異なるファイルバージョン間で手動で競合を解決するかどうか尋ねる場合は、私にとっては問題ありません。

私の最大の問題は、ネットワーク通信です。どのようにスレーブクライアントはファイルの変更について私の中央ストレージサーバに問い合わせるべきですか?私は定期的にメタデータを持つファイルリスト全体をサーバーに転送するのは良い考えではないと思います。限り、Dropboxが起動時に共有フォルダ全体をチェックすると、どういうわけかローカルファイルシステムの変更が通知されます(たとえば、Java7にはファイルシステムの変更イベントを聴く方法があります。たとえば、Java7にはWatchServiceクラスがあります)。ネットワーク同期イベントを待ち受けます。私はそれをやっているバージョン管理システムのようなファイルのリビジョンを維持すべきか、それとも他の解決策がありますか?

この件に関する書籍やオンライン資料はありますか?

答えて

1

私の最初の考えはrsyncです。あなたはファイル全体を転送する帯域幅ヒットが発生しないようにJarSync

rsyncのアルゴリズムは、デルタのファイルのを転送: Java実装では...それがうまくいくかもしれないが、その長い開発されていないがありました。 Linuxを使用している場合は、ネイティブrsyncクライアントをコマンドラインから実行するほうが簡単かもしれません。

WatchServiceは、変更を監視するのに便利なユーティリティです。私は過去数年間に使用されていた単純なポーリングメカニズムではなく、オペレーティングシステムのネイティブファイル変更イベントにフックすると信じています。

バージョン管理サポートが必要な場合は、おそらくSVNのようなものを調べる必要がありますか? SVNKitは、おそらく最高のjava svnクライアントです。 SVNがデルタを転送するかどうかはわかりません。 (疑わしい)。たぶんあなたはGitを代わりに使うことができます。私はそれがデルタを転送することを知っています。ここには、EclipseプロジェクトGit clientがあります。

幸運を祈る!

+0

SVN _stores_デルタを考えると、私はそれも同様に転送すると思います。 –

+0

私はSVNを多用していますので多分それが最良の選択でしょう。しかし、私はSVNの内部の仕組みを理解するのはちょっと残念です。私はそれを試してみましょう。私はSVNKitがSVNの純粋なJavaの実装であることを知らなかった、私はそれが単なるネイティブバイナリのラッパーだと思った。 たとえば、rsyncはオプションではありません。アンドロイド。また、それはCで書かれていて、私はCでうまくいきません。 – NagyI

+0

@ X-Zero、そうです。それは、SVNブックに従ってデルタを転送します。Git:-Pよりもはるかに遅いので、わからなかった。 –

0

多分、各ファイルのタイムスタンプを維持する必要があります。それが変化した場合は、ファイルをアップロード(またはあなたがアップロードする前に変更されているかどうかを確認するためにハッシュを確認してください)

プロジェクトは、ピュアJavaを必要としない場合は、これを行うにはrsyncを活用検討することができます。

+0

rsyncの最大の問題は、おそらく電話(Androidなど)で動作しないことです。タイムスタンプを比較することは、最小限のアプローチです。私も考えました。 – NagyI

関連する問題