我使用以下方法从TEXTFILE读取行,当它被更新或新行插入文本文件时我必须打印新行
在这个网站内搜索给我这个想法,但它无法正常工作
FileReader fr = new FileReader("filename.txt");
BufferedReader reader = new BufferedReader(fr);
while (true) {
String line = reader.readLine();
if (line != null) {
// Use line
}
else {
thread.sleep(1000);
}
}
我做错了什么?
注意:我需要在循环运行时捕获附加到Text文件的新行,我希望你很清楚
答案 0 :(得分:2)
您可以使用apache commons类“org.apache.commons.io.input.Tailer”。
TailerListener listener = new MyTailerListener();
Tailer tailer = new Tailer(file, listener, delay);
// simple executor impl. for demo purposes
Executor executor = new Executor() {
public void execute(Runnable command) {
command.run();
}
};
executor.execute(tailer);
例如
class MyTailerListener extends TailerListenerAdapter {
public void handle(String line) {
System.out.println(line);
}
}
TailerListener listener = new MyTailerListener();
Tailer tailer = Tailer.create(file, listener, 10000);
tailer.stop()
答案 1 :(得分:2)
import java.io.File;
import java.io.RandomAccessFile;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class Tailer implements Runnable {
private File file;
private int runEvery;
private long lastPosition = 0;
private boolean run = true;
public Tailer(String inputFile, int interval) {
file = new File(inputFile);
this.runEvery = interval;
}
public void stop() {
run = false;
}
public void run() {
try {
while(run) {
Thread.sleep(runEvery);
long fileLength = file.length();
if(fileLength > lastPosition) {
RandomAccessFile fh = new RandomAccessFile(file, "r");
fh.seek(lastPosition);
byte c;
while((c = (byte)fh.read()) != -1) {
System.out.print((char)c);
}
lastPosition = fh.getFilePointer();
fh.close();
}
}
}
catch(Exception e) {
stop();
}
}
public static void main(String argv[]) {
ExecutorService executor = Executors.newFixedThreadPool(4);
Tailer tailer = new Tailer("test.log", 1000);
executor.execute(tailer);
}
}
答案 2 :(得分:1)
在Linux中,
文件实际上是inode。使用gedit保存时,您的旧文件可能已被删除。例如:
首先,你有了带有inode编号10的filename.txt。而java正在阅读它。但是当您使用gedit保存编辑时。该文件可能被替换为 具有inode编号11的filename.txt但是Java应用程序仍在读取inode 10.因此应用程序将无法看到任何更改。 您可以尝试使用“ls -i”来查找文件的inode编号。查看编辑后是否更改。
答案 3 :(得分:0)
我唯一能想到的是,在进行更改时,您的文件不会保存,因此您的代码永远不会注册任何新行。此外,当您处于循环中时,它可能仍然打开原始文件,因此它永远不会打开带有更改的新文件。尝试将打开的文件放在while循环中,并确保也关闭该文件。