java 监听文件内容_java如何实现文件内容写入的实时监听

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

代码实现思路

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

代码实现效果:

java 监听文件内容_java如何实现文件内容写入的实时监听_第1张图片

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

实现代码如下:

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

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();

}

}

你可能感兴趣的:(java,监听文件内容)