2016-10-11 4 views
0

ich die folgende Methode verwendet haben Linien aus Textdateien zu lesen, whenver es aktualisiert oder neu in der Text-Datei eingefügten Zeilen i drucken müssen, dass neue LinieJava, Textdatei lesen nicht kontinuierlich arbeitet

innerhalb dieser Seite suchen gib mir die Idee, aber es funktioniert nicht

was mache ich falsch?

Hinweis: Ich brauche die neuen Linien zu erfassen, die in die Textdatei angehängt, während die Schleife läuft, ich hoffe, dass es Ihnen klar ist

+1

Meinst du, dass es sich ändert, während die While-Schleife läuft? – Foitn

+1

Endlosschleife. Vorsicht – FallAndLearn

+0

Wie aktualisieren Sie die Datei? – Ming

Antwort

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

Danke, es ist für mich gearbeitet, aber wie ich es ändere, um die ganze Zeile nicht Byte pro Byte zu lesen –

+0

danke, ich benutze fh.readline und es ist Arbeit –

+0

tatsächlich, es funktioniert nicht wie erwartet, wenn ich es Zeile für Zeile lesen möchten können Sie mir bitte helfen? –

1

Sie können die Apache Commons Klasse „org.apache.commons verwenden .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); 

Zum Beispiel

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

Das einzige, was ich denke, ist, dass Ihre Datei gespeichert wird nicht, wenn die Änderungen vorgenommen werden, so dass Ihr Code nie registriert neue Zeilen. Außerdem hat es wahrscheinlich immer noch die Originaldatei geöffnet, während Sie in der Schleife sind, so dass es die neue Datei nie mit den Änderungen öffnet. Versuchen Sie, die geöffnete Datei in die while-Schleife einzufügen und stellen Sie sicher, dass die Datei ebenfalls geschlossen wird.

1

In Linux,

Datei tatsächlich Inode. Ihre alte Datei wurde wahrscheinlich beim Speichern mit gedit gelöscht. Zum Beispiel:

Zuerst haben Sie filename.txt mit inode Nummer 10. Und das Java liest es. Aber wenn Sie speichern, bearbeiten Sie mit gedit. Die Datei wird wahrscheinlich durch Dateiname.txt durch Inode Nummer 11 ersetzt. Aber die Java-Anwendung liest immer noch den Inode 10. So wird die Anwendung keine Änderung sehen. Sie können versuchen, "ls -i" zu verwenden, um die Inode-Nummer Ihrer Datei herauszufinden. Sehen Sie, ob sich das nach der Bearbeitung geändert hat.

+0

das ist eine gute Erklärung, danke –