• 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); // 读取指定行的内容
            }
        }
    }
  • 相关阅读:
    Storm
    Linux 网络配置
    .NET Remoting
    jwt
    new操作符
    元数据
    C# lock
    三十而立
    面试
    灯火
  • 原文地址:https://www.cnblogs.com/shihaiming/p/16376659.html
Copyright © 2020-2023  润新知