Java는 파일을 실시간으로 모니터링하여 파일이 수정되면 매번 파일 업데이트 내용을 줄 단위로 가져옵니다.

I. 개요:

java를 사용하여 파일의 모니터링 기능을 구현하고 파일이 수정되면 업데이트된 내용을 실시간으로 얻을 수 있습니다.

1. 대상 파일에 대한 실시간 모니터링 필요

2. 파일을 한 줄씩 읽고 줄 내용을 업데이트합니다.

3. 획득한 콘텐츠를 창고에 넣습니다.

둘째, 기술 사용:

2.1 커먼즈-io

Commons-io의 모니터에서 관련 클래스를 사용하여 관찰자 모드로 구현된 파일 모니터링을 처리합니다.

  • (1) 폴더의 생성, 삭제 및 수정을 모니터링할 수 있습니다.
  • (2) 파일 생성, 삭제, 수정 모니터링 가능
  • (3) 옵저버 모드로 구현
  • (4) 스레드를 사용하여 탐지 파일의 변경 사항을 정기적으로 새로 고칩니다.

2.2 RandomAccessFile

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 기본 메서드 구현

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 효과 표시

  • 대상 파일 및 데이터베이스 보기(처음에는 비어 있음)

     

     

  • 한 줄의 데이터를 파일에 쓰고 저장

     

  • 데이터베이스를 확인하고 스토리지가 성공적인지 확인하십시오.

     

  • 데이터를 몇 개 더 추가하고 기본이 성공적으로 삭제되었는지 확인합니다.

     

     

 

추천

출처blog.csdn.net/qq_56044050/article/details/124214228