基于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写的一个文件新增内容监控器的更多相关文章

  1. Windows cmd 将命令(/指令)写到一个文件里,直接运行这个文件。提高工作效率

    Windows cmd 批处理(cmd/bat)文件的简单使用介绍 前言 如果你想我一样,要每天都需要在cmd上,用键盘去敲击相同的命令,时间一长,你就觉得很无聊.有没有什么比较高效的方法,让我们不用 ...

  2. java把一个文件的内容复制到另外一个文件

    /** * java把一个文件的内容复制到另外一个文件 */import java.io.File;import java.io.FileInputStream;import java.io.File ...

  3. 你知道怎么从jar包里获取一个文件的内容吗

    目录 背景 报错的代码 原先的写法 编写测试类 找原因 最终代码 背景 项目里需要获取一个excle文件,然后对其里的内容进行修改,这个文件在jar包里,怎么尝试都读取不成功,但是觉得肯定可以做到,因 ...

  4. AWK实现把一个文件根据内容进行分组输出多个文件

    AWK实现把一个文件根据内容进行分组输出多个文件 1.首先准备文件data.txt(分隔符为tab) 第一列省编码,第二列省名称...... 2.将该大文件根据第一列的省编码进行分组并输出到各个省编码 ...

  5. 新建txt文件新增内容并打印出

    #!/usr/bin/python import os file1=open("C:\Python34\ceshi.txt","a+");  #a+开一个文件用 ...

  6. 12小时包你学会基于ReactMix框架的ReactNativeApp开发(二)基于Css+HTML写第一个app页面

    上一篇文章,大家对于ReactMix(https://github.com/xueduany/react-mix)框架有了一个基本认识,知道我们是一个语法糖,帮助大家基于一套代码,所有平台都能跑.那么 ...

  7. Python文件读写 - 读一个文件所有行,加工后写另一个文件

    #Filename: file_read_and_write.py #打开文件,cNames读取所有行,储存在列表中,循环对每一行在起始处加上序号1,2,3,4 with open(r'file/co ...

  8. 基于Spring aop写的一个简单的耗时监控

    前言:毕业后应该有一两年没有好好的更新博客了,回头看看自己这一年,似乎少了太多的沉淀了.让自己做一个爱分享的人,好的知识点拿出来和大家一起分享,一起学习. 背景: 在做项目的时候,大家肯定都遇到对一些 ...

  9. 关于ACtion类利用file类型取得上传文件的内容,名字和内容类型

    上面的Action提供了两个属性:uploadFileName和uploadContentType,这个两个属性分别用于封转上传文件的文件名.上传文件的文件类型.Action类直接通过File类型属性 ...

随机推荐

  1. Linux性能优化实战内存篇(五)

    一.Linux内存工作原理 1,内存映射 Linux内核给每个进程都提供了一个独立的虚拟空间,并且这个地址空间是连续的.这样,进程就可以很方便地访问内存,更确切地说是访问虚拟内存. 虚拟地址空间的内部 ...

  2. C#解析Markdown文档,实现替换图片链接操作

    前言 又是好久没写博客了 其实也不是没写,是最近在「做一个博客」,从2月21日开始,大概一个多星期的时间,疯狂刷进度,边写代码边写了一整系列的博客开发笔记,目前为止已经写了16篇了,然后上3月之后工作 ...

  3. PO模式在selenium自动化测试框架有什么好处

    PO模式是在UI自动化测试过程当中使用非常频繁的一种设计模式,使用这种模式后,可以有效的提升代码的复用能力,并且让自动化测试代码维护起来更加方便. PO模式的全称叫page object model( ...

  4. ES77

    PUT rr_bd202_chaos_20211220{ "aliases" : { "rr_bd202_chaos_pgold":{} }, "ma ...

  5. P1030

    题面 给出一棵二叉树的中序排列与后序排列.求出它的先序排列.(约定树结点用不同的大写字母表示,长度≤8). 输入格式 2行,均为大写字母组成的字符串,表示一棵二叉树的中序排列与后序排列. 输出格式 1 ...

  6. String--Date互转

    相关类:DateFormat:抽象类DateFormat可以进行日期和字符串的格式化和解析,使用子类SimpleDateFormat实现. 1.Date --> String(格式化) publ ...

  7. vue解除双向绑定?

    let obj = JSON.parse(JSON.stringify(this.temp1));

  8. Java有没有goto?

    goto 是Java中的保留字,在目前版本的Java中没有使用.(根据James Gosling(Java之父)编写的<The Java Programming Language>一书的附 ...

  9. JdbcTemplate?

    JdbcTemplate 类提供了很多便利的方法解决诸如把数据库数据转变成基本数据类型或对象,执行写好的或可调用的数据库操作语句,提供自定义的数据错误处理.

  10. SpringMVC常用的注解有哪些?

    @RequestMapping:用于处理请求 url 映射的注解,可用于类或方法上.用于类上,则表示类中的所有响应请求的方法都是以该地址作为父路径. @RequestBody:注解实现接收http请求 ...