问题场景
在写定时器时遇到个问题,当定时器扫描某一固定文件夹下的内容进行处理时,可能这个文件夹还在被追加内容,这样定时器处理的内容就不准确了,为了解决它,笔者准备了一个哨兵,在每次轮到定时器处理前让哨兵进行一次检测,通过检测进行处理,否则这次任务跳过。
CODE
/**
* 判断指定目录下文件大小是否变化
*
* @param dir 监控的目录绝对路径
* @param period 统计时间间隔,ms
* @return -1 error; 0 no change; 1 change
*/
public static int isChange(String dir, long period) throws InterruptedException {
return isChange(new File(dir), period);
}
/**
* 判断指定目录下文件大小是否变化
*
* @param file 监控的文件
* @param period 统计时间间隔,ms
* @return -1 error; 0 no change; 1 change
*/
public static int isChange(File file, long period) throws InterruptedException {
int res = -1;
if (file.exists()) {
long sizeA = getAllSize4File(file);
if (sizeA > 0) {
Thread.sleep(period);
long sizeB = getAllSize4File(file);
long result = sizeB - sizeA;
if (result == 0) {
res = 0;
} else {
res = 1;
}
}
}
return res;
}
/**
* 获取文件夹下的所有文件的大小
*
* @param path 文件夹绝对路径
* @return
*/
public static long getAllSize4File(String path) {
return getAllSize4File(new File(path));
}
public static long getAllSize4File(File file) {
long res = 0;
if (file.exists()) {
File[] files = file.listFiles();
if (files != null) {
for (File file1 : files) {
if (file1.isDirectory()) {
res += getAllSize4File(file1.getAbsolutePath());
} else {
res += file1.length();
}
}
} else {
if (file.isFile()) {
res = file.length();
}
}
}
return res;
}