Алгоритмы синхронизации файлов / каталогов - PullRequest
1 голос
/ 11 августа 2011

Мне интересно написать приложение на Java, которое может автоматически синхронизировать файлы на моих устройствах (настольный компьютер, ноутбук, смартфон). Подобно Dropbox, но без стороннего сервера, потому что у меня есть свой собственный.

Поиск в сети. Я не нашел никаких полезных тем, рассказывающих об алгоритмах синхронизации, которые используются в таких программах. Я думаю, это не простая тема, учитывая тот факт, что эта проблема похожа на контроль версий. Из-за этого я думаю об отдыхе. Например. я (пока) не хочу реализовывать оптимизацию при передаче данных для изменений в файле, поэтому я могу передать весь файл, если он изменился. Также хорошо, если система попросит меня разрешить конфликты вручную между различными версиями файлов.

Моя самая большая проблема - сетевое общение. Как подчиненный клиент должен спрашивать / сообщать моему центральному серверу хранения об изменениях файлов? Я думаю, что не стоит периодически передавать весь список файлов с метаданными на сервер. Насколько я вижу, Dropbox проверяет всю общую папку при запуске, а затем как-то замечает изменения в локальной файловой системе (я знаю, что есть способ прослушивать события изменения файловой системы в ОС, например, в Java7 есть класс WatchService для этого) а также слушать события синхронизации сети. Должен ли я сохранять версии файлов, как это делают системы контроля версий, или есть другие решения?

Существуют ли книги или онлайн-материалы на эту тему?

Ответы [ 2 ]

1 голос
/ 11 августа 2011

Моя первая мысль - rsync. была реализацией Java .. она может работать, но больше не разрабатывается: JarSync

Алгоритм rsync передает дельты файлов, поэтому вы не берете на себя пропускную способностьхит передачи всего файла.Если вы работаете в Linux, может быть проще запустить нативный клиент rsync из командной строки.

WatchService - хорошая утилита для отслеживания изменений.Я полагаю, что он подключается к событиям изменения собственных файлов операционной системы, а не к наивному механизму опроса, который должен был использоваться в прошлые годы.

Если вам нужна поддержка версий, возможно, вам стоит заняться чем-то вроде SVN? SVNKit , вероятно, лучший Java-клиент SVN.Я не уверен, что SVN передаст дельты.(Я сомневаюсь).Может быть, вы могли бы вместо этого использовать Git.Я знаю, что это передает дельты.Вот проект затмения Git клиент .

Удачи!

0 голосов
/ 11 августа 2011

Может быть, вам нужно только сохранить временную метку для каждого файла.Если это изменится, вы загрузите файл (или проверьте хеш, чтобы увидеть, было ли оно изменено перед загрузкой)

Если ваш проект не требует чистой Java, вы также можете рассмотреть возможность использования rsync для этого,

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...