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 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); // 读取指定行的内容
}
}
}
看完打开支付宝扫一扫领个红包吧!
Original: https://www.cnblogs.com/shihaiming/p/16376659.html
Author: 这个名字想了很久~
Title: java监控文件变化,并分别使用RandomAccessFile和BufferedReader读取
原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/538243/
转载文章受原作者版权保护。转载请注明原作者出处!