基于File NIO写的一个文件新增内容监控器
基于File NIO写的一个文件新增内容监控器
需求说明
监控一个文件,如果文件有新增内容,则在控制台打印出新增内容.
代码示例
FileMoniter文件监控器类
package com.black.basic.io.bytestreams;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
/**
* 文件监控器,如果文件有新增内容,则输出文件新增内容
*
* @author black
* @date 2022-01-19 12:04:016
*/
public class FileMoniter {
public static void main(String[] args) {
FileMoniter moniter = new FileMoniter();
// 获取工程里文件
ClassLoader classLoader = moniter.getClass().getClassLoader();
String fileName = classLoader.getResource("com/black/basic/io/test_file_en.txt").getFile();
// 开始监控文件
moniter.moniter(fileName);
}
// 监控文件
public void moniter(String fileName) {
File file = new File(fileName);
// 判断文件是否可读,如果可读,进行扫描;反之,不做处理
if (checkRead(file)) {
// 文件可读,开始扫描文件,输出文件新增内容
scan(file);
} else {
System.out.println("文件无法读取!");
}
}
// 是否可读
public boolean checkRead(File file) {
return file.exists() & file.canWrite();
}
public void scan(File file) {
// 文件读取位置
long curPosition = 0;
// 文件大小
long size = -1;
// 文件最后修改日期
long lastModifiedTime = 0L;
while (true) {
sleep();
// 判断文件是否修改
if (lastModifiedTime == file.lastModified()) {
// 没有修改则跳过此次处理.
continue;
} else {
// 更新当前修改时间
lastModifiedTime = file.lastModified();
}
try (FileChannel fc = new FileInputStream(file).getChannel();) {
// 判断有无新增内容
long fcSize = fc.size();
if (size == fcSize) {
// 没有新增内容则跳过此次处理.
continue;
} else {
size = fcSize;
}
// 判断当前文件读取位置
if (curPosition != 0) {
fc.position(curPosition);
}
// 分配 1024 字节的buffer
ByteBuffer bf = ByteBuffer.allocate(1024);
int c;
// 读取文件内容到 buffer,返回读取字节数c
while ((c = fc.read(bf)) > 0) {
// limit=positon,position =0
bf.flip();
byte[] b = new byte[c];
// 读取buffer中的内容到字节数组 b
bf.get(b);
// 打印 b
System.out.print(new String(b));
// 清除 buffer 为下次读取准备
bf.clear();
// 更新当前文件读取位置
curPosition = fc.position();
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
// 暂停 1秒
public void sleep() {
try {
TimeUnit.SECONDS.sleep(1L);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
本地工程的com.black.basic.io包下test_file_en.txt文件内容:
# test file encoding UTF-8
name age
基于File NIO写的一个文件新增内容监控器的更多相关文章
- Windows cmd 将命令(/指令)写到一个文件里,直接运行这个文件。提高工作效率
Windows cmd 批处理(cmd/bat)文件的简单使用介绍 前言 如果你想我一样,要每天都需要在cmd上,用键盘去敲击相同的命令,时间一长,你就觉得很无聊.有没有什么比较高效的方法,让我们不用 ...
- java把一个文件的内容复制到另外一个文件
/** * java把一个文件的内容复制到另外一个文件 */import java.io.File;import java.io.FileInputStream;import java.io.File ...
- 你知道怎么从jar包里获取一个文件的内容吗
目录 背景 报错的代码 原先的写法 编写测试类 找原因 最终代码 背景 项目里需要获取一个excle文件,然后对其里的内容进行修改,这个文件在jar包里,怎么尝试都读取不成功,但是觉得肯定可以做到,因 ...
- AWK实现把一个文件根据内容进行分组输出多个文件
AWK实现把一个文件根据内容进行分组输出多个文件 1.首先准备文件data.txt(分隔符为tab) 第一列省编码,第二列省名称...... 2.将该大文件根据第一列的省编码进行分组并输出到各个省编码 ...
- 新建txt文件新增内容并打印出
#!/usr/bin/python import os file1=open("C:\Python34\ceshi.txt","a+"); #a+开一个文件用 ...
- 12小时包你学会基于ReactMix框架的ReactNativeApp开发(二)基于Css+HTML写第一个app页面
上一篇文章,大家对于ReactMix(https://github.com/xueduany/react-mix)框架有了一个基本认识,知道我们是一个语法糖,帮助大家基于一套代码,所有平台都能跑.那么 ...
- Python文件读写 - 读一个文件所有行,加工后写另一个文件
#Filename: file_read_and_write.py #打开文件,cNames读取所有行,储存在列表中,循环对每一行在起始处加上序号1,2,3,4 with open(r'file/co ...
- 基于Spring aop写的一个简单的耗时监控
前言:毕业后应该有一两年没有好好的更新博客了,回头看看自己这一年,似乎少了太多的沉淀了.让自己做一个爱分享的人,好的知识点拿出来和大家一起分享,一起学习. 背景: 在做项目的时候,大家肯定都遇到对一些 ...
- 关于ACtion类利用file类型取得上传文件的内容,名字和内容类型
上面的Action提供了两个属性:uploadFileName和uploadContentType,这个两个属性分别用于封转上传文件的文件名.上传文件的文件类型.Action类直接通过File类型属性 ...
随机推荐
- (acwing蓝桥杯c++AB组)1.2 递推
1.2 递推与递归 文章目录 1.2 递推与递归 位运算相关知识补充 pair与vector相关知识补充 题目目录与网址链接 下面的讲解主要针对这道题目的题解AcWing 116. 飞行员兄弟 - A ...
- 常见的Socket网络异常场景分析
原创:打码日记(微信公众号ID:codelogs),欢迎分享,转载请保留出处. 简介 在目前微服务的背景下,网络异常越来越常见了,而有一些网络异常非常模糊,理解什么情况下会导致什么异常,还是有一定难度 ...
- Java基础—构造方法
1.构造方法概述 构造方法是一种特殊的方法,用来创建对象,当我们不定义时,系统会默认给出一个无参构造方法:一旦我们定义了任意的构造方法,系统就不会给出默认的无参构造方法 格式如下: public ca ...
- kubernetes如何强制删除namespace
K8S如何强制删除namespace 先运行kubectl get namespace ingress-nginx -o json > nginx.json,拿到当前namespace描述,然后 ...
- Centos7下开启防火墙,允许通过的端口
1.查看防火墙状态 systemctl status firewalld 2.如果不是显示active状态,需要打开防火墙 systemctl start firewalld 3.# 查看所有已开放的 ...
- bzoj5315/luoguP4517 [JSOI2018]防御网络(仙人掌,dp)
bzoj5315/luoguP4517 防御网络(仙人掌,dp) bzoj Luogu 题目描述略(太长了) 题解时间 本题和斯坦纳树无关. 题面保证了是一个仙人掌...? 但这个环之间甚至交点都没有 ...
- SpringAOP--代理
前言 在Spring或者SpringBoot中,可以通过@Aspect注解和切点表达式等配置切面,实现对某一功能的织入.然而其内部到底是如何实现的呢? 实际上,Spring在启动时为切点方法所在类生成 ...
- Math.round(11.5)等於多少? Math.round(-11.5)等於多少?
Math类中提供了三个与取整有关的方法:ceil.floor.round,这些方法的作用与它们的英文名称的含义相对应,例如,ceil的英文意义是天花板,该方法就表示向上取整,所以,Math.ceil( ...
- Java 中的final关键字有哪些用法?
(1)修饰类:表示该类不能被继承:(2)修饰方法:表示方法不能被重写:(3)修饰变量:表示变量只能一次赋值以后值不能被修改(常量).
- int 和 Integer 有什么区别?
Java 是一个近乎纯洁的面向对象编程语言,但是为了编程的方便还是引入了基本 数据类型,但是为了能够将这些基本数据类型当成对象操作,Java 为每一个基本 数据类型都引入了对应的包装类型(wrappe ...