计算机中的要实现实时都是主要有两种思路,第一种就是计算机再做了某个事件过程后去通知某个人,第二种就是一个人一直盯着要被监督的对象,发现他发生改变就做出相应反应。
代码实现思路
新线程==>死循环读文件==>记录文件最新位置==>记录每次最新写入==>写入内容处理
代码实现效果:
上述写入提交是实时的,图片没法展示。
实现代码如下:
监听文件模板,每次监听到文件返回监听到的内容,对内容进行相应处理。
packagesrc.listener;public abstract class BaseFileListenner implementsRunnable{public voidlisten(){
String s=listenNewLine();
doService(s);
}public abstractString listenNewLine();public abstract voiddoService(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.. [email protected]
* 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();
}
}