Textdatei (.txt) in Java automatisch alle 4 Sekunden einlesen?
Guten Abend, wie kann ich nach dem ich einmal einen button gedrückt habe eine Textdatei alle 4sec. ohne erneutes betätigen des Buttons einlesen lassen. Wie ich eine Textdatei allgemein lesen kann habe ich herausgefunden nur das es automatisch alle 4 sec gemacht wird bekomme ich nicht hin. Wollte es mit einem Timer versuchen, weis aber nicht genau was für einen ich nehmen muss/oder ob es eine andere Lösung gibt. Da ich bei Google auf einige verschiedene Timer gestoßen bin. Vielleicht hat ja schon jemand etwas ähnliches gemacht. (Ich bin noch ein ziemlicher Anfänger was Java betrifft)
Danke
3 Antworten
Ein Timer Beispiel ist schnell geschrieben:
int intervall = 4000; Timer timer = new Timer(); TimerTask timertask = new TimerTask() { @Override public void run() { // Dein Code hier
}
};
timer.schedule(timertask, 0, intervall);
Hierbei wird der Code der "run" Methode alle vier Sekunden erneut ausgeführt.
ob es eine andere Lösung gibt.
Gibt es möglicherweise. - Allerdings wäre die Frage an dich gerechnet, was denn genau passieren soll und ob es möglicherweise einen "Grund" geben kann, der dieses Wiederholen abbrechen soll.
Ob das so lange passieren soll bis eine Bedingung erfüllt ist?
Was das erneute Drücken des Buttons bewirkt?
Kann ich das prinzipiell überhaupt direkt in die Methode schreiben?
Theoretisch ja, aber es wäre 'besser' zu erstellst für die einzelnen Programm-Bereiche eigene Methoden.
Trenne Methoden nach Sinn und Inhalt und halte diese so kurz wie möglich:
private String labelTextAusDatei() { String labeltext = .... .... return labeltext; }
private void aktualisiereLabelText() { String labelText = labelTextAusDatei(); this.label.setText(labelText); }
letztere Methode kannst du dann per Timer aufrufen lassen (siehe Antwort oben).
Du schriebst bereits, dass dein Kenntnisstand noch auf Anfänger-Ebene ist, daher wirst du vermutlich gerade über das Problem gestolpert sein, dass man nicht auf alle Variablen zugreifen kann, sofern man Anonyme Klassen verwendet, wie oben bei: TimerTask und dessen Run-Methode: Verwende als Referenz innerhalb der Anonymen-Inneren-Klasse daher Deinen Klassennamen plus this plus Variable oder Methode für ein besseres Verständnis:
Beispiel:
class MeineKlasse { private int meineVariable; void test() { new Runnable() { @Override public void run() { MeineKlasse.this.meineVariable = 12; } } }
ScheduledExecutorService executor = Executors.newScheduledThreadPool(1);
executor.scheduleAtFixedRate(() -> {
try (Stream<String> stream = Files.lines(Paths.get("test.txt"))) {
stream.forEach(System.out::println);
} catch(IOException ioe) {}
}, 0, 3, TimeUnit.SECONDS);
So zum Beispiel. Hier wird die Datei alle drei Sekunden ausgelesen und der Inhalt Zeile für Zeile ausgegeben.
Vom Prinzip her genau das was ich gesucht habe und es funktioniert auch sehr gut. Allerdings will ich immer nur die erste Zeile der Datei auslesen und diese in einem Label oder Textfeld ausgeben lassen.
Habe bisher aber die Textdatei nur über einen FileReader eingelesen und weis deshalb nicht wie ich das nun abändern muss bzw. kann.
Wenn Sie mir das noch erklären könnten.
Vielen Dank für ihre Mühe, LG
Das mit dem Timer ist hier gut erklärt: http://stackoverflow.com/questions/4044726/how-to-set-a-timer-in-java
Und das mit dem einlesen von Dateien: http://stackoverflow.com/questions/326390/how-do-i-create-a-java-string-from-the-contents-of-a-file
Passieren soll danach, dass der Inhalt der ersten Zeile aus der Textdatei (Datei hat nur eine Zeile) in einer Variable gespeichert wird und diese dann in einem Label ausgegeben wird. Das hatte ich bisher mit einem FileReader gemacht der die erste Zeile List, das dann als variable gespeichert und den label text zu: ""+variable gesetzt. Hat soweit funktioniert. Es soll danach bis gegebenenfalls der Button wobei ich einen toggle button verwendet hätte wieder in Stellung falsch ist. Dadurch wäre dann neues drücken eh Stellung falsch und es würde abbrechen. Das würde ich aber denke ich hinbekommen. Prinzipiell hatte ich es aber schon si probiert, aber als ich den code in die methode, die gestartet werden soll wenn button gedrückt ist, hat das nicht funktioniert. Kann ich das prinzipiell überhaupt direkt in die Methode schreiben? Oder wo muss das hin und dann in der methode nur noch timer = start o.ä schreiben? Danke für ihre Mühe