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); // 读取指定行的内容 } } }
看完打开支付宝扫一扫领个红包吧!