2016-10-11 83 views
0

我用下面的方法來從一個文本閱讀線,whenver被更新或插入到文本文件的新線,我必須打印新的生產線Java中,閱讀文本文件連續工作不

本網站內搜索給我的想法,但它不起作用

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

我做錯了什麼?

注:我需要捕捉新的生產線循環運行,而附加到文本文件,我希望它很清楚,你

+1

你的意思是它在while循環運行時發生變化嗎? – Foitn

+1

無限循環。當心 – FallAndLearn

+0

你如何更新文件? – Ming

回答

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); 
    } 
} 
+0

謝謝,它適用於我,但我怎麼改變它來讀整行不是字節每個字節 –

+0

謝謝,我使用fh。readline,它實際上工作 –

+0

,它不按預期工作,當我需要逐行讀取它時,請幫助我嗎? –

1

您可以使用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() 
0

我能想到的是,讓你的代碼永遠不會登記任何文件時,不進行改變,保存的唯一的事新的線路。此外,它可能仍然在循環中打開原始文件,因此它永遠不會使用更改打開新文件。嘗試將打開的文件放在while循環中,並確保也關閉文件。

1

在Linux中,

文件實際上是inode。使用gedit進行保存時,您的舊文件可能已被刪除。例如:

首先,您的filename.txt的inode編號爲10.並且java正在讀取它。但是當你用gedit保存編輯。該文件可能被替換爲 filename.txt,其inode編號爲11.但Java應用程序仍在讀取inode 10.因此,應用程序將無法看到任何更改。 您可以嘗試使用「ls -i」來查找文件的inode號碼。看看編輯後它是否改變。

+0

這是一個很好的解釋,謝謝 –