Javaはリアルタイムでファイルを監視し、ファイルが変更された場合、ファイルの更新内容をその都度行ごとに取得します

I. 概要:

javaを利用してファイルの監視機能を実現し、ファイルが変更されると更新内容をリアルタイムで取得します。

1. 対象ファイルのリアルタイム監視が必要

2. ファイルを 1 行ずつ読み取り、行の内容を更新する

3.入手したコンテンツを倉庫に入れる

第二に、テクノロジーの使用:

2.1 コモンズアイオ

Commons-io の監視下にある関連クラスを使用して、オブザーバー モードによって実装されるファイルの監視を処理します。

  • (1) フォルダの作成、削除、変更を監視できる
  • (2) ファイルの作成、削除、変更を監視できる
  • (3) オブザーバーモードで実現
  • (4) スレッドを使用して、検出ファイルの変更を定期的に更新する

2.2 ランダムアクセスファイル

他のストリームの親クラスとは異なり、RandomAccessFile の唯一の親クラスは Object です。RandomAccessFile は通常、データ レコードを保存するファイルにアクセスするために使用されます. これは、レコードにアクセスするための seek( ) メソッドを提供し、レコード位置から読み書きできます. これらのレコードのサイズは同じである必要はありません; しかし、それらのサイズと位置を知る必要があります。

3. 具体的な手順

3.1 2.0 以降を必要とする commons-io パッケージの導入

<!-- https://mvnrepository.com/artifact/commons-io/commons-io -->
<dependency>
  <groupId>commons-io</groupId>
  <artifactId>commons-io</artifactId>
  <version>2.6</version>
</dependency>

3.2 FileAlterationListenerAdaptor を継承するクラス FileListener を作成する

package utils;
import java.io.File;
import java.io.IOException;

import org.apache.commons.io.monitor.FileAlterationListenerAdaptor;
import org.apache.commons.io.monitor.FileAlterationObserver;


public class FileListener extends FileAlterationListenerAdaptor {
    ReadTest readTest = new ReadTest();
    /**
     * 文件创建执行
     */
    public void onFileCreate(File file) {
        //也可以打印日志
        System.out.println("文件[新建]:" + file.getAbsolutePath());
    }
    /**
     * 文件创建修改
     */
    public void onFileChange(File file) {
        System.out.println("文件[修改]:" + file.getAbsolutePath());
         //目标文件路径
        String str = "d:\\test\\est.txt";
        //如果被修改的是目标文件,执行自己的业务操作
        if(str.equals(file.getAbsolutePath())){
            try {
                readTest.readAW();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    /**
     * 文件删除
     */
    public void onFileDelete(File file) {

        System.out.println("文件[删除]:" + file.getAbsolutePath());
    }
    /**
     * 目录创建
     */
    public void onDirectoryCreate(File directory) {

        System.out.println("[新建]:" + directory.getAbsolutePath());
    }
    /**
     * 目录修改
     */
    public void onDirectoryChange(File directory) {
        System.out.println("[修改]:" + directory.getAbsolutePath());
    }
    /**
     * 目录删除
     */
    public void onDirectoryDelete(File directory) {

        System.out.println("[删除]:" + directory.getAbsolutePath());
    }
    public void onStart(FileAlterationObserver observer) {
        // TODO Auto-generated method stub
        super.onStart(observer);
    }
    public void onStop(FileAlterationObserver observer) {
        // TODO Auto-generated method stub
        super.onStop(observer);
    }
}
  • ファイル監視の原則は次のとおりです。
  • ファイル監視クラスFileAlterationMonitor のスレッドは、継続的にファイルをスキャンしてFileAlterationObserverを監視し、ファイルの変更があった場合は、該当するファイル コンパレータに従って、ファイルが追加、削除、または変更されたかどうかを判断します。(スキャンを実行するためのデフォルトは 1000 ミリ秒です)

3.3 main メソッドの実装

public static void main(String[] args) throws Exception{
    // 监控目录
    String rootDir = "D://test";
    // 轮询间隔
    long interval = TimeUnit.SECONDS.toMillis(1);
    // 创建过滤器
    IOFileFilter directories = FileFilterUtils.and(
        // 只监听文件夹、目录
        FileFilterUtils.directoryFileFilter(),
        // 此过滤器接受File隐藏的
        HiddenFileFilter.VISIBLE);
    IOFileFilter files    = FileFilterUtils.and(
        // 只监听文件
        FileFilterUtils.fileFileFilter(),
        // 只监听文件后缀为txt的文件
        FileFilterUtils.suffixFileFilter(".txt"));
    IOFileFilter filter = FileFilterUtils.or(directories, files);
    // 使用过滤器
    FileAlterationObserver observer = new FileAlterationObserver(new File(rootDir), filter);
    //不使用过滤器
    //FileAlterationObserver observer = new FileAlterationObserver(new File(rootDir));
    observer.addListener(new FileListener());
    //创建文件变化监听器
    FileAlterationMonitor monitor = new FileAlterationMonitor(interval, observer);
    // 开始监控
    monitor.start();
  }

ここまでで、ファイルの監視は完了です。次にmain()メソッドを起動し、対象ファイルを操作し、対象ファイルが変更されたことをリスナーが検知すると、FileListenerクラス配下のonFileChange()で指定された操作を実行します。

次に、 RandomAccessFileを使用してテキストを読み取り、コンテンツを行ごとに更新する必要があります。

3.4 readAW()の実装(自営業)

public class ReadTest {
    //设置变量 记录上次读取位置
    private long num = 0;

    public void readAW() throws IOException {
        File file = new File("d://test//est.txt");
        RandomAccessFile randomAccessFile = new RandomAccessFile(file,"rw");
        //将文件定位到偏移量所指位置,在该位置发生下一个读取或写入操作
        randomAccessFile.seek(num);
        //获取按行读取的数据并落库
        String s = randomAccessFile.readLine();
        for(;s!= null;s = randomAccessFile.readLine()){
            User user = new User();
            user.setUserName(s);
            userServer.insertUser(user);
        }
        //重新计算偏移量,做下一次读取时的初始偏移量
        num= randomAccessFile.length();
    }
}

注:この書き方では、更新ごとにファイルの末尾に追加されたコンテンツしか取得できず、ファイルの以前のコンテンツの変更は不明です。

3.5 エフェクト表示

  • ターゲット ファイルとデータベースを表示します。最初は空です

     

     

  • ファイルに 1 行のデータを書き込んで保存する

     

  • データベースをチェックして、保存が成功していることを確認します

     

  • さらにいくつかのデータを追加し、基底が正常に削除されたことを確認します

     

     

 

おすすめ

転載: blog.csdn.net/qq_56044050/article/details/124214228
おすすめ