java监控文件变化,并分别使用RandomAccessFile和BufferedReader读取

import java.io.File;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.util.concurrent.TimeUnit;

import org.apache.commons.io.filefilter.FileFilterUtils;
import org.apache.commons.io.filefilter.HiddenFileFilter;
import org.apache.commons.io.filefilter.IOFileFilter;
import org.apache.commons.io.monitor.FileAlterationListenerAdaptor;
import org.apache.commons.io.monitor.FileAlterationMonitor;
import org.apache.commons.io.monitor.FileAlterationObserver;
import org.apache.commons.lang3.StringUtils;

import lombok.extern.slf4j.Slf4j;
/**
 * 文件变化监听器
 * 在Apache的Commons-IO中有关于文件的监控功能的代码. 文件监控的原理如下:
 * 由文件监控类FileAlterationMonitor中的线程不停的扫描文件观察器FileAlterationObserver,
 * 如果有文件的变化,则根据相关的文件比较器,判断文件时新增,还是删除,还是更改。(默认为1000毫秒执行一次扫描)
 */
@Slf4j
public class FileListener extends FileAlterationListenerAdaptor {
    
    //记录上次读取位置
    private long num = 0;
    
    public static void main(String[] args) throws Exception {
        // 监控目录
        String rootDir = "E:\\data\\";
        // 轮询间隔 毫秒
        long interval = TimeUnit.MILLISECONDS.toMillis(500);
        // 创建过滤器
        IOFileFilter directories = FileFilterUtils.and(FileFilterUtils.directoryFileFilter(), HiddenFileFilter.VISIBLE);
        IOFileFilter files = FileFilterUtils.and(FileFilterUtils.fileFileFilter(),
                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();
    }
    
    /**
     * 文件修改
     */
    public void onFileChange(File file) {
        changeNotice(file.getAbsolutePath(), "文件修改");
        log.info("[修改]:" + file.getAbsolutePath());

        RandomAccessFile randomAccessFile = null;
        try {
            randomAccessFile = new RandomAccessFile(file, "r");
            randomAccessFile.seek(num);

            String s = randomAccessFile.readLine();
            
                for (; s != null; s = randomAccessFile.readLine()) {
                    if (StringUtils.isNotBlank(s)) {
                        log.info("修改内容:" + new String(s.getBytes("ISO-8859-1"), "utf-8"));
                    }
                }

            num = randomAccessFile.length();
            log.info("下一次的num号:" + num);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (randomAccessFile != null) {
                try {
                    randomAccessFile.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
    
    
 /**
   * 文件创建执行
   */
  public void onFileCreate(File file) {
    changeNotice(file.getAbsolutePath(), "文件创建");
    log.info("[新建]:" + file.getAbsolutePath());
  }
      
  /**
   * 文件删除
   */
  public void onFileDelete(File file) {
    changeNotice(file.getAbsolutePath(), "文件删除");
    log.info("[删除]:" + file.getAbsolutePath());
  }
  /**
   * 目录创建
   */
  public void onDirectoryCreate(File directory) {
    changeNotice(directory.getAbsolutePath(), "目录创建");
    log.info("[新建]:" + directory.getAbsolutePath());
  }
  /**
   * 目录修改
   */
  public void onDirectoryChange(File directory) {
    changeNotice(directory.getAbsolutePath(), "目录修改");
//    log.info("[修改]:" + directory.getAbsolutePath());
  }
  
  /**
   * 目录删除
   */
  public void onDirectoryDelete(File directory) {
    changeNotice(directory.getAbsolutePath(), "目录删除");
//    log.info("[删除]:" + directory.getAbsolutePath());
  }
  public void onStart(FileAlterationObserver observer) {
//    log.info("文件变化监听器启动");
    super.onStart(observer);
  }
  public void onStop(FileAlterationObserver observer) {
//    log.info("文件变化监听器停止");
    super.onStop(observer);
  }
  
  public void changeNotice(String filePath, String type) {
//      log.info(type + ":"+ filePath);
  }
  
}

 

 

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.LineNumberReader;
import java.util.Scanner;

public class ReadFile2 {
    // 输出本行内容及字符数
    static void readLineVarFile(String fileName, int lineNumber) throws IOException {
        BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(fileName))); // 使用缓冲区的方法将数据读入到缓冲区中
        String line = reader.readLine(); // 定义行数
        if (lineNumber <= 0 || lineNumber > getTotalLines(fileName)) // 确定输入的行数是否有内容
        {
            System.out.println("不在文件的行数范围之内。");
        }
        int num = 0;
        while (line != null) // 当行数不为空时,输出该行内容及字符数
        {
            if (lineNumber == ++num) {
                System.out.println("第" + lineNumber + "行: " + line + "     字符数为:" + line.length());
            }
            line = reader.readLine();
        }
        reader.close();
    }

    // 文件内容的总行数
    static int getTotalLines(String fileName) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(fileName))); // 使用缓冲区的方法将数据读入到缓冲区中
        LineNumberReader reader = new LineNumberReader(br);
        String s = reader.readLine(); // 定义行数
        int lines = 0;
        while (s != null) // 确定行数
        {
            lines++;
            s = reader.readLine();
        }
        reader.close();
        br.close();
        return lines; // 返回行数
    }

    public static void main(String[] args) throws IOException {
        String fileName = "E:\\data\\a.txt"; // 读取文件
        int totalNo = getTotalLines(fileName); // 获取文件的内容的总行数
        System.out.println("本文总共有:" + totalNo + "行");
        while (true) {
            Scanner sc = new Scanner(System.in);
            int lineNumber = sc.nextInt(); // 指定读取的行号
            readLineVarFile("E:\\\\data\\\\a.txt", lineNumber); // 读取指定行的内容
        }
    }
}

 

posted @ 2022-06-14 22:12  这个名字想了很久~  阅读(335)  评论(0编辑  收藏  举报