基于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类型属性 ...
随机推荐
- 七天接手react项目 系列 —— react 脚手架创建项目
其他章节请看: 七天接手react项目 系列 react 脚手架创建项目 前面我们一直通过 script 的方式学习 react 基础知识,而真实项目通常是基于脚手架进行开发. 本篇首先通过 reac ...
- Makefile 入门(加减乘除实现)
Makefile 入门(加减乘除实现) 准备 使用任意Linux发行版即可,本文使用WSL Ubuntu. 开始之前,需要安装必要的工具: sudo apt install make g++ 开始 1 ...
- linux内存(二)高端内存
来此网址 https://ilinuxkernel.com/?p=1013 Linux内核地址映射模型x86 CPU采用了段页式地址映射模型.进程代码中的地址为逻辑地址,经过段页式地址映射后,才真正访 ...
- Python knife 一款伪菜刀
Python knife 一款伪菜刀. 设计之初,本想只写个命令行的就可以了,但又想与众不同,想用python写代码,又不想用c#写前端(c#太卡了),万分无奈之下,找到一个替代品,Pyqt, ...
- 如何移植sqlite3到嵌入式平台
本人也时常看其他人的blog,搜索资料的目的是尽快解决当前的问题,例如如何移植一个ssh,尽快要明白所需的东西,方能移植完成. 移植sqlite3的步骤如下: 1. 到官方网站下载指定的源码包:htt ...
- HMS Core机器学习服务图像超分能力,基于深度学习提升新闻阅读体验
在移动端阅读资讯时,人们对高分辨率.高质量的图像要求越来越高.但受限于网络流量.存储.图片源等诸多因素,用户无法便捷获得高质量图片.移动端显示设备的高分辨率图片获得问题亟待解决.不久前,HMS Cor ...
- 半吊子菜鸟学Web开发6 -- Vscode开发环境配置
1vscode上手一周不到,终于弄出点门路,终于弄清楚了点vscode的设置是什么样子的了....哭 2就我这两天的使用来看,一般vscode默认只让打开一个文件夹,然后在你打开的文件夹里面自动生成 ...
- Hibernate的一级缓存和二级缓存有什么区别?
第一级缓存由Session实例维护,它是必选的,其中保持了Session当前所有关联实体的数据,也称为内部缓存.而第二级缓存则存在于SessionFactory层次,它是可选的.一级缓存只能为当前线程 ...
- 为什么使用 Executor 框架比使用应用创建和管理线程好?
为什么要使用 Executor 线程池框架 1.每次执行任务创建线程 new Thread()比较消耗性能,创建一个线程是比较耗 时.耗资源的. 2.调用 new Thread()创建的线程缺乏管理, ...
- ssl免密登录(centos6)
1.首先执行ll -a查看是否有隐藏文件.ssh,如果没有,需要执行ssh localhost登录以下即可 cd ~/.ssh 2.生成秘钥: 可查看https://hadoop.apache.org ...