java.nio.file.FileSystemException bei Dateizugriff vermeiden

Snert

Neues Mitglied
Hallo zusammen,

wäre wirklich super, wenn mir hier jemand einen Tipp geben kann. Ich überwache in einer Schleife ein Verzeichnis und lese dort abgelegte CSV Dateien als String Arrays zur Weiterverarbeitung ein.

Dabei erfolgt aus der Schleife ein Aufruf:

Code:
Path quelle;
//...
while (true) {
//...
   quelle = Paths.get("D:/MeinPfad/"+event.context());
   if(Files.exists(quelle, new LinkOption[]{ LinkOption.NOFOLLOW_LINKS})) {
      datenArray = fileToArray(quelle.toString());
   }
}

Die entsprechende Methode:

Code:
   private String[] fileToArray(String filename) {
      String fileName = filename;
      List<String> list = new ArrayList<>();
      try (Stream<String> stream = Files.lines(Paths.get(fileName))) {
         list = stream.collect(Collectors.toList());
         stream.close();
      } catch (NoSuchFileException e) {
         System.out.println(filename+" nicht gefunden");
      } catch (IOException e) {
         e.printStackTrace();
      }
//...
}

Dabei kommt es dann hin und wieder zu einer Exception:

Code:
java.nio.file.FileSystemException: D:\MeinPfad\test_table1.csv: Der Prozess kann nicht auf die Datei zugreifen, da sie von einem anderen Prozess verwendet wird.

Die Exception tritt direkt bei "try (Stream<String> stream = Files.lines(Paths.get(fileName))) {" auf. aber manchmal beim 2., manchmal dem 200. einlesen der gleichen Datei. Wie kann ich das verhindern? Ich dachte ursprünglich wenn ich den stream schließe wäre alles in Ordnung.

Danke im Voraus für jegliche Hilfe,
Snert
 
Wenn ich dich richtig verstehe, versuchst du zu überprüfen, ob sich Dateien in einem bestimmten Pfad geändert haben. Offensichtlich gibt es also ein anderes Programm, das diese Dateien ändert. Kann es sein, dass dieses Programm gerade eine Datei ändert (und gesperrt hat), während du versuchst, die Datei zu lesen?
 
Hallo.

Also du die Klasse File hat Methoden die du nutzen könntest wie z. B

canRead(), canExecute(), canWrite()

Oder die Files Klasse hat auch solch Methoden.

Files.isExecutable, Files.isReadable, Files.isWritable

Grüße
 
Sorry, konnte leider vorher nicht gucken. Erstmal danke für die Antworten. Einen Watchservice habe ich eigentlich auch im Einsatz (da war der Code Ausschnitt doof gewählt) aber vermutlich dann noch nicht vernünftig - das lese ich mir erstmal in Ruhe durch.

@HarleyDavidson: Danke für den Link!

@fhoffmann: Genauer gesagt werden im überwachten Verzeichnis CSV Dateien abgelegt. Diese werden zur Weiterverarbeitung eingelesen und die Ursprungsdatei verschoben/archiviert. Andere Programme kann ich eigentlich ausschließen, außer irgendwelche Windows Prozesse die ich nicht auf dem Zettel habe.

@truesoul: Du würdest also eher vorab prüfen und dann gegebenenfalls verzögern?

Nur mal so zusammengefasst? Die fileToArray-Methode scheint hier nicht das Problem zu sein, sondern tendenziell _irgendwelche_ externen Zugriffe?

Danke nochmal!
 
Wer stellt die csv-Dateien dort denn bereit?
Wenn es ein Programm ist, das die Dateien bereitstellt, wäre es eine übliche Lösung, dass das Programm die Dateien mit einer anderen Dateiendung (z.B. ".csv_temp") in das Verzeichnis kopiert und sie erst nach dem Kopieren in ".csv" umbenennt.
Dein Programm würde sich nur für Dateien mit der Endung ".csv" interessieren.
 

Neue Themen


Zurück
Oben