Datenüberwachung funktioniert nicht

Hallo ich entwickle gerade ein Getränkelagerverwaltungssystem für mein Studium. Dabei soll ein separater Thread alle 40 Sekunden prüfen, ob eine Datei namens 'done.csv' vorhanden ist. Falls diese Datei existiert, soll ihr Inhalt in der Konsole angezeigt werden. Nach der Verarbeitung gelöscht.
Hier der bisherige Code:

Java:
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.concurrent.TimeUnit;

public class ExternalDataChecker implements Runnable {
    @Override
    public void run() {
        while (true) {
            try {
                // Pfad zur Datei done.csv
                String filePath = "resources/done.csv";
                File file = new File(filePath);

                // Überprüfen, ob die Datei existiert
                if (file.exists()) {
                    try {
                        // Dateiinhalt auslesen
                        String content = new String(Files.readAllBytes(Paths.get(filePath)));

                        // Inhalt in ein Array namens externalData speichern
                        String[] externalData = content.split(",");

                        // Ausgabe des Array-Inhalts:
                        for (String data : externalData) {
                            System.out.println(data);
                        }

                        // Nach der Ausgabe die Datei löschen
                        if (file.delete()) {
                            System.out.println("Datei gelöscht.");
                        } else {
                            System.err.println("Fehler beim Löschen der Datei.");
                        }

                        // Array leeren
                        externalData = new String[0];
                    } catch (IOException e) {
                        System.err.println("Fehler beim Lesen der Datei: " + e.getMessage());
                    }
                } else {
                    System.out.println("Datei existiert nicht.");
                }

                // Alle 40 Sekunden erneut überprüfen
                TimeUnit.SECONDS.sleep(40);
            } catch (InterruptedException e) {
                System.err.println("Thread-Unterbrechung: " + e.getMessage());
            }
        }
    }
}
public class Main {
    public static void main(String[] args) {

        WarehousemanagementModel warehouseModel = new WarehousemanagementModel();
        WarehousemanagementController warehouseController = new WarehousemanagementController();
        WarehousemanagementView warehouseView = new WarehousemanagementView(warehouseController);
        warehouseController.setModel(warehouseModel);
        warehouseController.setView(warehouseView);
        warehouseView.initializeGUI();

        // Erstellen einer Instanz des Runnable
        Runnable externalDataChecker = new ExternalDataChecker();

        // Erstellen eines Thread für das Runnable und setzen als Hintergrundthread
        Thread thread = new Thread(externalDataChecker);
        thread.setDaemon(true);

        thread.start();

        while (true) {

        }
    }
    }
Problem : Beim Starten der Anwendung wird die 'done.csv'-Datei entdeckt, ausgelesen und anschließend gelöscht. Wenn der Zyklus erneut durchläuft und ich done.csv manuell erstelel und mit Inhalt fülle , wird 'done.csv' erneut gefunden, aber sofort gelöscht, wodurch das Array leer bleibt. Der Inhalt des Array soll nachher an eine andere Methode übergeben werden können, ist aber noch nicht im Code implentiert, Kann mir jemand einen Tipp geben ? Danke
 

Jw456

Top Contributor
Prüfe doch vor dem löschen erst mal ob du auch Daten im Array hast.



Das BS ist meist etwas langsamer. Warte da etwas, nach dem feststellen das die Datei da ist.
 
Zuletzt bearbeitet:

Oneixee5

Top Contributor
Du solltest niemals java.io und java.nio in einem Vorgang mischen. Es gibt da einige Probleme mit java.io welche in java.nio behoben wurden. Weiterhin ist Bytes -> String für Textdateien nicht gerade ideal.
Java:
        Path myPath = Paths.get("...");

        Stream<String> lines = Files.lines(myPath, StandardCharsets.UTF_8);
        String data = lines.collect(Collectors.joining("\n"));
        lines.close();

        // List <String> lines = Files.readAllLines(myPath, StandardCharsets.UTF_8);
        // ...

        // BufferedReader reader = Files.newBufferedReader(myPath);
        // ...

        Files.delete(myPath);
 

Marinek

Bekanntes Mitglied
Hi,

also gerade für den Anwendungsfall "Dateien überwachen" gibt es in java nio einen Watchservice.

Siehe hier: https://www.baeldung.com/java-nio2-watchservice

Hiermit werden BS Mittel verwendet, um Änderungen zum Beispel in einem Verzeichnis zu horchen, dann muss man nicht immer alle 30 Sekunden pollen ;).

Das Leeren des Arrays ist unnötig. Es ist ja eine lokale Variable, die dann ehh abgeräumt wird.

Wenn du die Datei manuell erstellst, bis du den Content da eingegeben hast und dann gespeichert hast, wird die Datei vorher gelöscht.

Üblicherweise sollte eine fertige Datei dort abgelegt werden. Solange sie noch ggf. von einem anderen Prozess geschrieben wird, musst du die Datei benennen in "done.tmp.csv" oder so und erst, wenn sie fertig ist, benennst du sie um in done.csv. Dann kannst du dir sicher sein, dass der nächste Prozess die Datei vollständig liest.

Gruß,
Martin
 

Hough

Mitglied
Ergänzend zu dem, was zum Thema unfertige Datei schon geschrieben wurde: eine weitere Möglichkeit wäre, die Datei erst zu verarbeiten, wenn ihr letzter Schreibzugriff eine bestimmte Zeit zurückliegt.

Mit dem nio-Watchservice habe ich keine so guten Erfahrungen gemacht. Langsam und teuer. Bin dann bei meiner eigenen Pollingversion geblieben.
 
Hi,

also gerade für den Anwendungsfall "Dateien überwachen" gibt es in java nio einen Watchservice.

Siehe hier: https://www.baeldung.com/java-nio2-watchservice

Hiermit werden BS Mittel verwendet, um Änderungen zum Beispel in einem Verzeichnis zu horchen, dann muss man nicht immer alle 30 Sekunden pollen ;).

Das Leeren des Arrays ist unnötig. Es ist ja eine lokale Variable, die dann ehh abgeräumt wird.

Wenn du die Datei manuell erstellst, bis du den Content da eingegeben hast und dann gespeichert hast, wird die Datei vorher gelöscht.

Üblicherweise sollte eine fertige Datei dort abgelegt werden. Solange sie noch ggf. von einem anderen Prozess geschrieben wird, musst du die Datei benennen in "done.tmp.csv" oder so und erst, wenn sie fertig ist, benennst du sie um in done.csv. Dann kannst du dir sicher sein, dass der nächste Prozess die Datei vollständig liest.

Gruß,
Martin
Das mit der Überwachung alle 40 sek ist Vorgabe vom Prof.
 
Woran kann es liegen das wenn die Datei done.csv im Windows Explorer neu erstellt wird, das auslesen der Datei nach 40sek sehr gut klappt, wenn ich die done.csv aber in Intellij erstelle die Datei zwar gefunden wird aber der Inhalt des Arrays leer bleibt?
 

Jw456

Top Contributor
Lege die Datei mal nicht in den Resources Ordner, sondern in ein Verzeichnis auf der HD. Zugriff auch für den Explorer.
 
Zuletzt bearbeitet:

KonradN

Super-Moderator
Mitarbeiter
Woran kann es liegen das wenn die Datei done.csv im Windows Explorer neu erstellt wird, das auslesen der Datei nach 40sek sehr gut klappt, wenn ich die done.csv aber in Intellij erstelle die Datei zwar gefunden wird aber der Inhalt des Arrays leer bleibt?
Evtl. hast Du die Datei nicht gespeichert? Die Änderungen sind halt immer erst nur im Editor selbst und werden nicht sofort geschrieben. Wenn Du den Inhalt manuell hinzufügst, dann ist die Chance groß, dass in den Sekunden auch die 40 Sekunden abgelaufen sind und die leere Datei gefunden wird.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
mo13 JTextField funktioniert nicht Java Basics - Anfänger-Themen 4
J .jar datei öffnen funktioniert nicht Java Basics - Anfänger-Themen 17
G Mit jPackage erstellte EXE funktioniert nicht Java Basics - Anfänger-Themen 2
G Robot funktioniert nicht bei SelectionListener Java Basics - Anfänger-Themen 6
R RegEx funktioniert nicht Java Basics - Anfänger-Themen 14
S 2 Reihen ratio-btn, eine Reihe funktioniert andere nicht Java Basics - Anfänger-Themen 4
monsterherz Punkt Notation funktioniert nicht Java Basics - Anfänger-Themen 4
N Programm Funktioniert mit .txt Datei aber nicht mit .rtf Datei Java Basics - Anfänger-Themen 2
D Quellcode für cmd funktioniert nicht Java Basics - Anfänger-Themen 9
ms_cikar Bin to Float convertieren funktioniert nicht Java Basics - Anfänger-Themen 24
B Schrankensystem mit Farberkennung für Flashgame funktioniert nicht wie geplant Java Basics - Anfänger-Themen 4
I Greenscreen, funktioniert nicht zu 100%... nicht alle Pixel werden geändert Java Basics - Anfänger-Themen 1
JordenJost char variable funktioniert irgendwie nicht a+b ergibt nicht à Java Basics - Anfänger-Themen 4
M Operatoren Strings mit Vergleichsoperatoren, funktioniert das? Java Basics - Anfänger-Themen 9
Garrit1994 Continue funktioniert nicht wie geplant Java Basics - Anfänger-Themen 4
B Methoden Übergebe Variabel funktioniert nicht Java Basics - Anfänger-Themen 17
P exportiertes Programm funktioniert nur teilweise Java Basics - Anfänger-Themen 7
Agent4nobody Programmstart durch aufruf des interpreters funktioniert nicht Java Basics - Anfänger-Themen 14
Fugover Programm funktioniert nicht Java Basics - Anfänger-Themen 11
X Datentypen String.equals funktioniert nicht Java Basics - Anfänger-Themen 5
berserkerdq2 wie funktioniert contenthandler, was muss ich bei der Methode startElement und endElement tun? Java Basics - Anfänger-Themen 11
Alen123 Warum funktioniert mein Code nicht? Java Basics - Anfänger-Themen 64
sserio Array funktioniert nicht Java Basics - Anfänger-Themen 2
sserio Wieso funktioniert mein Programm nicht Java Basics - Anfänger-Themen 2
A String split funktioniert nicht, wenn mehr als 1 Ziffer vor dem Zeichen steht nach dem er trennen soll? Java Basics - Anfänger-Themen 4
sserio Größtes Palindrom-Produkt Programm funktioniert nur halb Java Basics - Anfänger-Themen 23
sserio Rekursion größten Primfaktor finden funktioniert nicht Java Basics - Anfänger-Themen 8
sserio Wieso funktioniert mein TableView nicht /JavaFX. Java Basics - Anfänger-Themen 4
Avalon Warum funktioniert eine Bedingung und eine andere nicht? Java Basics - Anfänger-Themen 2
J Datentypen String in File konvertieren funktioniert nicht Java Basics - Anfänger-Themen 4
U Wie genau funktioniert der ! Operator Java Basics - Anfänger-Themen 3
stormyark 4 Bit in einer for-schleife funktioniert nicht Java Basics - Anfänger-Themen 3
J Nach dem Exportieren funktioniert mein Programm nicht mehr Java Basics - Anfänger-Themen 8
M Java printf(Locale.... funktioniert nicht Java Basics - Anfänger-Themen 3
N Wieso funktioniert die Deklaration nicht Java Basics - Anfänger-Themen 3
C Long value an Stringbuilder übergeben, equals Methode funktioniert nicht Java Basics - Anfänger-Themen 2
districon Backtracking funktioniert nicht ganz Java Basics - Anfänger-Themen 3
H Array rückwärts auslesen funktioniert nicht Java Basics - Anfänger-Themen 3
S Math.random funktioniert nicht Java Basics - Anfänger-Themen 5
S Schleife funktioniert nicht Java Basics - Anfänger-Themen 2
B Ausgabe in TextArea funktioniert nicht Java Basics - Anfänger-Themen 2
Henri Webservice Delete und Update Methode funktioniert nicht Java Basics - Anfänger-Themen 27
J ActionListener von JCheckBox im Knoten von JTree funktioniert nicht Java Basics - Anfänger-Themen 2
C System.out.println - Parameterübergabe funktioniert nicht Java Basics - Anfänger-Themen 2
JD_1998 Hilfsmethode if return funktioniert nicht Java Basics - Anfänger-Themen 2
C JButton Text 2 Mal ändern funktioniert nicht Java Basics - Anfänger-Themen 8
T % funktioniert nicht Java Basics - Anfänger-Themen 2
D e(fx)clipse installieren funktioniert nicht Java Basics - Anfänger-Themen 3
D GPIO Nutzung mit Pi4J Library auf Raspberry funktioniert nicht Java Basics - Anfänger-Themen 3
F Java GUI-PaintComponent funktioniert nicht Java Basics - Anfänger-Themen 1
J equals funktioniert nicht - Warum Java Basics - Anfänger-Themen 13
L hilfe run button funktioniert nicht Java Basics - Anfänger-Themen 13
I Array funktioniert nicht. Java Basics - Anfänger-Themen 2
T if else Befehl funktioniert nicht richtig Java Basics - Anfänger-Themen 27
V_Fynn03 Erste Schritte BubbleSort Quelltext funktioniert noch nicht Java Basics - Anfänger-Themen 1
V_Fynn03 Erste Schritte JButton funktioniert nicht trotz richtiger Methode. Java Basics - Anfänger-Themen 17
R Erste Schritte Eclipse - Java - System.out.println(); funktioniert nicht Java Basics - Anfänger-Themen 2
G Programm mit Schleife funktioniert nicht Java Basics - Anfänger-Themen 5
T Redirect funktioniert nicht Java Basics - Anfänger-Themen 3
R Mein Plugin funktioniert nicht? Java Basics - Anfänger-Themen 10
J Zufallszahl funktioniert nicht Java Basics - Anfänger-Themen 27
D Klassen add Methode funktioniert nicht. Java Basics - Anfänger-Themen 31
J ImagaIO funktioniert nicht unter Ubuntu Java Basics - Anfänger-Themen 23
F Vergleiche mit charAt funktioniert bei Strings nicht, was tun? Java Basics - Anfänger-Themen 5
N Wochentagberechner Ausgabe funktioniert nicht Java Basics - Anfänger-Themen 7
G Mein Java Projekt funktioniert nicht Java Basics - Anfänger-Themen 5
J Einlesen von Datei funktioniert nicht Java Basics - Anfänger-Themen 8
W Wieso funktioniert mein Switch Case nicht ?! Java Basics - Anfänger-Themen 9
P Zeichenkette Zeichen ausschlißen funktioniert nicht richtig Java Basics - Anfänger-Themen 9
F Primzahlsuche Schleife funktioniert nicht, HILFE! Java Basics - Anfänger-Themen 8
M Methoden Arrays.deepequals() funktioniert nicht Java Basics - Anfänger-Themen 2
B Statische Methode return funktioniert nicht. Java Basics - Anfänger-Themen 19
S JDK 9 für Windows 32 bit installiert, aber es funktioniert nix Java Basics - Anfänger-Themen 6
F Input/Output die eine txt-Datei funktioniert die andere nicht Java Basics - Anfänger-Themen 8
CptK Interface Bild über Methode ändern funktioniert nicht Java Basics - Anfänger-Themen 4
D Funktion zwei Arraylisten zu verleichen ob gleich funktioniert nicht Java Basics - Anfänger-Themen 26
A Hilfe bei Rekursion,Ich verstehe nicht,wie funktioniert die Rekursion in der Methode "walk" Java Basics - Anfänger-Themen 13
P Vererbung Warum funktioniert die Vererbung hier nicht Java Basics - Anfänger-Themen 14
P Upload Button funktioniert nicht Java Basics - Anfänger-Themen 13
S Dijkstra Algorithmus funktioniert nicht Java Basics - Anfänger-Themen 4
M Datei einlesen mit Scanner funktioniert nicht (FileNotFoundException) Java Basics - Anfänger-Themen 6
A TicTacToe funktioniert bis auf "schiefer" Sieg Java Basics - Anfänger-Themen 6
M Erste Schritte Importieren funktioniert nicht Java Basics - Anfänger-Themen 7
N Funktion funktioniert nicht immer Java Basics - Anfänger-Themen 6
F FileCreation - PrintWriter funktioniert nicht... Java Basics - Anfänger-Themen 1
I Collections.shuffle funktioniert nicht Java Basics - Anfänger-Themen 1
T Methode in Klasse funktioniert nicht Java Basics - Anfänger-Themen 14
T While Schleife funktioniert nicht Java Basics - Anfänger-Themen 14
C Warum funktioniert 'instanceof' bei generics nicht? Java Basics - Anfänger-Themen 4
M Frage, wie dieser Code funktioniert, bzw. weshab er bei mir nicht funktioniert Java Basics - Anfänger-Themen 4
L Level Reset funktioniert nicht Java Basics - Anfänger-Themen 3
A Java Scanner Funktioniert nicht Java Basics - Anfänger-Themen 2
R Kleines Java Spiel funktioniert nicht. Java Basics - Anfänger-Themen 2
W Warum funktioniert mein Programm nicht ? Java Basics - Anfänger-Themen 12
B OOP Objekt in IF erzeugen - funktioniert nicht so richtig Java Basics - Anfänger-Themen 11
W Warum funktioniert meine if Anweisung nicht? Java Basics - Anfänger-Themen 8
J Stringvergleich funktioniert nicht Java Basics - Anfänger-Themen 8
W Warum funktioniert mein Programm nicht ? Java Basics - Anfänger-Themen 6
L Taschenrechner mit switch und while funktioniert noch nicht richtig Java Basics - Anfänger-Themen 22
S Backspace Abfrage funktioniert nicht Java Basics - Anfänger-Themen 4

Ähnliche Java Themen

Neue Themen


Oben