Java,连续读取文本文件不起作用

时间:2016-10-11 06:20:34

标签: java

我使用以下方法从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文件的新行,我希望你很清楚

4 个答案:

答案 0 :(得分:2)

您可以使用apache commons类“org.apache.commons.io.input.Tailer”。

https://commons.apache.org/proper/commons-io/javadocs/api-2.4/org/apache/commons/io/input/Tailer.html

  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循环中,并确保也关闭该文件。