0

Ich lege eine XML-Datei in den ScanFolder einer Windows-Maschine und Java überwacht diese Dateierstellung und löst meine ProcessFileMethod.FileInputstream - FileNotFound (der Prozess kann nicht auf die Datei zugreifen). Arbeitet auf die Anwendung von Breakpoint

 if(event.kindOf("create") { 
      processFile (filePath); // call process file from watcher service 
     } 

     processFile(Path filePath) { 
      FileInputStream fileInputStream = null; 
      File inProcessFile = new File(filePath.toString()); 
      // inprocess file exists at this point 

      try 
      { 
       fileInputStream = new FileInputStream(inProcessFile); 
      } catch (Exception e) 
      { 
       // filenotfoundexception thrown. 
      } finally { 
      fileInputStream.close(); 
      } 

      } 

Problem

Etwas hält auf die Datei (Fenster nativen?). Das Anwenden eines Breakpoints gibt genug Verzögerung, aber ohne dass es eine Ausnahme auslöst.

Versucht - file.canRead, canWrite, canExecute, existiert - alle Prüfungen vor der Instantiierung zu verifizieren.Alle geben wahr zurück.

Ausnahme:

\ java.io.FileNotFoundException: C: \ scanFolder \ File (4) - Copy.xml (Der Prozess kann nicht auf die Datei zugreifen, da sie von einem anderen Prozess verwendet wird)

+1

Sieht aus, als ob Sie zwischen der Erstellung von 'FileInputStream' und etwas anderem, das diese Datei ebenfalls verwendet, eine Art Race-Bedingung haben. Angenommen, ein externes Programm erstellt die Datei im exklusiven Modus, erfasst Ihr Watcher dieses Ereignis und versucht dann, die Datei zu öffnen. Dies kann aufgrund des exklusiven Modus fehlschlagen. Check ist einfach: Fügen Sie etwas Verzögerung (wie 'Thread.sleep (1000)') hinzu, bevor Sie die Datei öffnen. Wenn dein Problem verschwindet, ist es definitiv eine Wettlaufsituation und du solltest herausfinden, wer die Datei benutzt. – yeputons

+0

Beachten Sie, dass, selbst wenn das hilft, es als ein sehr schlechter Stil angesehen wird, Rassenbedingungen durch Schlafen zu heilen. Wie ist das schön, ist wahrscheinlich eine separate Frage. – yeputons

+0

Es ist die Race-Bedingung @ ieputons. Danke für den Hack-Freund, der wie 30 ms schläft. Ich muss herausfinden, was es hält –

Antwort

2

Das Problem hier ist, dass während Sie versuchen, "fileInputStream = new FileInputStream (inProcessFile);" Der "andere" Prozess, der die Datei erstellt hat, ist noch nicht fertig. Das Hinzufügen des Unterbrechungspunkts gibt genügend Verzögerung für den Prozess, um die Datei abzuschließen und freizugeben, daher keine Ausnahme. Schließen Sie if (inProcessFile.canRead()) vor dem Erstellen des FileInputStream-Objekts ein.

+0

InProcessFile.canRead() gibt immer True zurück, sogar vor der Instanziierung, wenn es ohne einen Breakpoint laufen gelassen wird. Nur einen Thread zu schlafen funktioniert :( –

Verwandte Themen