计算机中的要实现实时都是主要有两种思路,第一种就是计算机再做了某个事件过程后去通知某个人,第二种就是一个人一直盯着要被监督的对象,发现他发生改变就做出相应反应。

 

  代码实现思路

 

新线程==>死循环读文件==>记录文件最新位置==>记录每次最新写入==>写入内容处理

 

代码实现效果:

java 监控上线 java实时监控文件_java 监控上线

 

 

上述写入提交是实时的,图片没法展示。

实现代码如下:

监听文件模板,每次监听到文件返回监听到的内容,对内容进行相应处理。

package src.listener;

public abstract class BaseFileListenner implements Runnable{

public void listen(){
String s = listenNewLine();
doService(s);
}

public abstract String listenNewLine();

public abstract void doService(String s);
}

 

代码的具体实现类,监听到内容,将内容打印到控制台。

package src.listener;

import org.apache.commons.lang.StringUtils;

import java.io.File;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.charset.StandardCharsets;
import java.util.concurrent.TimeUnit;

/**
* Copyright.. lbhbinhao@163.com
* Author:liubinhao
* Date:2020/12/22
* +++++ ______ ______ ______
* ++++/ /| / /| / /|
* ++/_____/ | /_____/ | /_____/ |
* | | | | | | | | |
* | | | | | |________| | |
* | | | | | / | | |
* | | | | |/___________| | |
* | | |___________________ | |____________| | |
* | | / / | | | | | | |
* | |/ _________________/ / | | / | | /
* |_________________________|/b |_____|/ |_____|/
*/

/**
*
*/
public class FileListenner extends BaseFileListenner{
/**
* the last modify time of the file being listened
*/
private long lastModifyTime = 0L;
/**
* the last modify position of the file
*/
private long seekPosition = 0L;
/**
* the file path
*/
private String filePath;
public String getFilePath() {
return filePath;
}

public void setFilePath(String filePath) {
this.filePath = filePath;
}

 

@Override
public void run() {
while (true) {
listen();
try {
TimeUnit.MILLISECONDS.sleep(500L);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}

@Override
public String listenNewLine() {
String result = null;
try {
File listenFile = new File(filePath);
if (listenFile.lastModified() > lastModifyTime) {
lastModifyTime = listenFile.lastModified();
RandomAccessFile file = new RandomAccessFile(listenFile, "r");
file.seek(seekPosition);
byte[] bytes = new byte[(int) (file.length() - seekPosition)];
seekPosition = file.length();
file.read(bytes);
result = new String(bytes, StandardCharsets.UTF_8);
}
} catch (IOException e) {
e.printStackTrace();
}
return result;
}

/**
* Carry out business operation on the changed contents of the monitored files, such as writing to Kafka
*/
@Override
public void doService(String s) {
if (StringUtils.isNotBlank(s)) {
System.err.print(s);
}
}

public static void main(String[] args) {
// FileListenner fileListenner = new FileListenner();
// fileListenner.setFilePath("D:\\company\\ruigu_pro\\scala-ding\\src\\main\\scala\\dm\\test\\readme.txt");
// new Thread(fileListenner).start();
FileListenner fileListenner1 = new FileListenner();
fileListenner1.setFilePath("D:\\company\\ruigu_pro\\scala-ding\\src\\main\\scala\\dm\\test\\test.txt");
new Thread(fileListenner1).start();
}

}