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)
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
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
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 –