【Java超入門】ファイル同期アプリを自作!WatchServiceで簡単リアルタイム更新対応

プログラミング

「毎回手作業でフォルダをコピーするのが面倒」
「USBやクラウドを使わずにローカルで同期したい」
そんな悩みを解決してくれるのが、Javaで自作するファイル同期アプリです。

同期対象のフォルダを指定して、新規ファイル・更新ファイルのみを自動でコピーすることで、
自分だけのバックアップアプリを手に入れることができます。

この記事では、誰でも簡単に作れるファイル同期アプリを、
実際のコードとともにわかりやすく解説します。


ファイル同期アプリとは何か?

毎日の手動コピーを自動化する便利ツール

結論:フォルダ内のファイルを自動で別フォルダにコピーしてくれる仕組みです。

手作業でのバックアップは面倒でミスも起きがちです。
ファイル同期アプリがあれば、特定のフォルダの更新・作成を監視し、自動でコピーしてくれます。

総務省の情報通信白書でも、データの保全・自動化・効率化の重要性が提言されています。
(出典:https://www.soumu.go.jp/johotsusintokei/whitepaper/ja/r05/html/)


同期アプリの基本構成を理解する

必要な機能は次の3つです

結論:以下の3つだけでシンプルな同期アプリが完成します。

  • 監視対象フォルダの指定
  • 新規・変更ファイルの検出
  • コピー先フォルダへの反映処理

構成図:

1
2
3
src/
├─ FileSyncApp.java
└─ FileUtils.java

同期処理の土台:FileUtils.java

1
2
3
4
5
6
7
8
9
import java.io.*;
import java.nio.file.*;
 
public class FileUtils {
    public static void copyFile(Path source, Path target) throws IOException {
        Files.createDirectories(target.getParent());
        Files.copy(source, target, StandardCopyOption.REPLACE_EXISTING);
    }
}

メイン処理の実装:FileSyncApp.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
import java.io.IOException;
import java.nio.file.*;
import static java.nio.file.StandardWatchEventKinds.*;
 
public class FileSyncApp {
    public static void main(String[] args) throws IOException, InterruptedException {
        Path sourceDir = Paths.get("C:/watch/source");
        Path targetDir = Paths.get("C:/watch/backup");
 
        WatchService watcher = FileSystems.getDefault().newWatchService();
        sourceDir.register(watcher, ENTRY_CREATE, ENTRY_MODIFY);
 
        System.out.println("監視を開始しました。");
 
        while (true) {
            WatchKey key = watcher.take();
            for (WatchEvent<?> event : key.pollEvents()) {
                Path filename = (Path) event.context();
                Path sourcePath = sourceDir.resolve(filename);
                Path targetPath = targetDir.resolve(filename);
 
                try {
                    FileUtils.copyFile(sourcePath, targetPath);
                    System.out.println("同期完了:" + filename);
                } catch (IOException e) {
                    System.out.println("コピー失敗:" + e.getMessage());
                }
            }
            boolean valid = key.reset();
            if (!valid) break;
        }
    }
}

よくあるエラーとその対処法

エラーで止まらないアプリにするには

  • ファイルがロックされてコピーに失敗する
  • 解決策:数秒待機してリトライする構造にする
  • フォルダが存在しないと例外が出る
  • 解決策:Files.createDirectories()で事前に生成する
  • 対象外のイベントで止まってしまう
  • 解決策:event.kind() をログ出力し、不要なものは無視

応用機能の追加でさらに実用的に

バージョン管理やログ出力も可能です

  • 日付付きバックアップ保存
  • ログファイルへの書き出し
  • ENTRY_DELETEを監視して削除対応
  • タイマーで定期的に全同期(WatchServiceを使わない方式)

完成形構成のまとめ

  • FileUtils.java:ファイルコピーの共通処理
  • FileSyncApp.java:同期処理の本体ロジック
  • 対象フォルダ:例)C:/watch/sourceC:/watch/backup

まとめ:Javaでファイル管理を効率化

この記事では、Javaで作る簡単なファイル同期アプリの構築方法を解説しました。

この記事で得られる学び:

  • フォルダ監視の仕組み(WatchService
  • ファイル操作の基礎(Files.copy()Path操作)
  • シンプルなアプリで自動化を実現する考え方

まずは動かしてみて、あなたの環境に合わせてオリジナル同期アプリに育てていきましょう!

タイトルとURLをコピーしました