FileNotFound (Zugriff verweigert) Ausnahme auf java.io
Warum bekomme ich diese Fehlermeldung, wenn ich dieses Programm ausführen? Dies erfolgt nach dem Zufallsprinzip Iterationen. In der Regel nach der 8000er iteration.
public static void main(String[] args)
{
FileWriter writer = null;
try
{
for(int i = 0; i < 10000; i++)
{
File file = new File("C:\\Users\\varun.achar\\Desktop\\TODO.txt");
if(file.exists())
{
System.out.println("File exists");
}
writer = new FileWriter(file, true);
writer.write(i);
System.out.println(i);
writer.close();
if(!file.delete())
{
System.out.println("unable to delete");
}
//Thread.sleep(10);
//writer = null;
//System.gc();
}
}
catch(IOException e)
{
e.printStackTrace();
}
finally
{
if(writer != null)
{
try
{
writer.close();
}
catch(IOException e)
{
e.printStackTrace();
}
}
}
}
Nachdem die Ausnahme Auftritt, wird die Datei nicht vorhanden ist. Das bedeutet, dass die es löschen, aber FIleWriter versucht, die Sperre vor, dass, obwohl es ist nicht ein multi-threaded Programm. Ist es, weil der Windows nicht löschen Sie die Datei schnell genug, und daher der FileWriter nicht eine Sperre? Wenn ja, dann die Datei.delete () - Methode gibt, bevor windows tatsächlich löscht es?
Wie kann ich es lösen, da bin ich immer ein ähnliches Problem beim laden testen meiner Anwendung.
EDIT 1: Stacktrace:
java.io.FileNotFoundException: C:\Users\varun.achar\Desktop\TODO.txt (Access is denied)
at java.io.FileOutputStream.openAppend(Native Method)
at java.io.FileOutputStream.<init>(FileOutputStream.java:192)
at java.io.FileOutputStream.<init>(FileOutputStream.java:116)
at java.io.FileWriter.<init>(FileWriter.java:61)
EDIT 2 : Datei Hinzugefügt.exists() und file.löschen von Bedingungen im Programm. und die neue stacktrace:
7452
java.io.FileNotFoundException: C:\Users\varun.achar\Desktop\TODO.txt (Access is denied)
at java.io.FileOutputStream.openAppend(Native Method)
at java.io.FileOutputStream.<init>(FileOutputStream.java:192)
at java.io.FileWriter.<init>(FileWriter.java:90)
at com.TestClass.main(TestClass.java:25)
EDIT 3 Thread dump
TestClass [Java Application]
com.TestClass at localhost:57843
Thread [main] (Suspended (exception FileNotFoundException))
FileOutputStream.<init>(File, boolean) line: 192
FileWriter.<init>(File, boolean) line: 90
TestClass.main(String[]) line: 24
C:\Users\varun.achar\Documents\Softwares\Java JDK\JDK 6.26\jdk\jre\bin\javaw.exe (09-Nov-2011 11:57:34 PM)
BEARBEITEN 4 : Programm läuft erfolgreich auf anderen Rechner mit dem gleichen OS. Nun, wie Stelle ich sicher, dass die app mit laufen erfolgreich in der Maschine bereitgestellt wird, in?
- Pls. post Stacktrace auch.
- was ist die Ausnahme, auch das, was sind Sie versuchen zu testen?
- Die
Thread.sleep()
scheint zu helfen, aber ich kann nicht, dass in dem Programm, sonst ist es ein Jahrhundert und eine Hälfte, um die vollständige Ausführung. Ich könnte versuchen ein Erwerb Sperre, bis es gelingt, aber gibt es eine bessere Möglichkeit? - Ich würde zuerst versuchen, um zu überprüfen
delete()
's Rückgabewert - ist es immertrue
? Gilt die Ausnahme, kommen auswriter.close()
oder auswriter.write()
oder beim erstellen derwriter
? Auch, was meinst du mit "sperren"? Ich sehe keine Schlösser im Programm. - Was ist die Ausnahme? Und auch nach dem stack-trace.
- Sperre für den FileWriter zum schreiben in die Datei.
- Ich bin laden testen meiner app und ich bin immer diese Fehlermeldung. Ich habe gerade neu in diesem Programm.
- Sie testen es auf die Plattform und-version??
- java 6.26 + windows 7
- Pls. überprüfen Sie für
file.delete()
Wert und lassen Sie uns wissen, das Ergebnis kurz vor die Ausnahme. - Helfen tut es nicht. Die Linie nach
if(!file.delete())
wird nicht ausgeführt. Wederif(file.exists())
die derzeit vor der Erstellung derFileWriter
- Versuchen Sie, etwas weired. Versuchen Sie dasselbe Programm nach chagning Speicherort der Datei, und ändern Sie den Namen der Datei zu.
- scheint das Problem mit dem window7 permission manager
- Ich bekomme das gleiche Problem auf xp 32 bit. Nicht sicher, warum? Andere haben erlebt, wie gut. Ich glaube, dass wenn ich versuche mit nicht-Anhängen, die wird funktionieren.
- Verwenden Sie die Technik, die ich erklärt habe, in meiner eigenen Antwort. Ist fail safe.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Auf jedem OS Sie können nur eine bestimmte Anzahl der offenen Dateien/threads am Stück. Sie scheinen zu werden, schlagen Sie Ihre OS-Grenze. Versuchen Sie, die Datei zu null in der Schleife.
file = null; writer = null; System.gc();
löst das problem.System.gc()
ist entscheidend.Wenn ich verstehe deine stack-trace-korrekt, ist die Ausnahme kommt, wenn versucht wird, erstellen Sie eine neue
FileWriter
. Es ist unmöglich zu wissen, den Grund, ohne Prüfung ein bisschen weiter.File.delete()
gibt.FileWriter
überprüfen, wasFile.exists()
gibt.Wenn die vorherigen
delete()
zurücktrue
und dieexists()
direkt nach es gibt auchtrue
in einem single-threaded Programm, dann ist es in der Tat etwas seltsam.Edit: so scheint es, dass die Löschung erfolgreich war und die Datei nicht vorhanden ist, nach, dass. Dass es, wie soll es funktionieren, natürlich, so ist es seltsam, warum
FileWriter
wirft die Ausnahme. Ein weiterer Gedanke, versuchen, die KontrolleFile.getParentFile().canWrite()
. Das ist, tun Sie Ihre Berechtigungen zum schreiben in das Verzeichnis irgendwie verschwinden.Edit 2:
Bisher haben Sie eine Maschine, die funktioniert falsch und eine, der ordnungsgemäß funktioniert. Vielleicht könnten Sie versuchen, es auf noch mehr Maschinen. Es ist möglich, dass die erste Maschine ist irgendwie defekt und verursacht Fehler. Es ist erstaunlich, wie oft digitalen Computern und Ihren Programmen (ich meine das OS und Java, nicht unbedingt in Ihr Programm) kann nur ein "bisschen kaputt", so dass Sie arbeiten fast perfekt fast alle Zeit, aber nicht zufällig mit bestimmten hardware - & verwenden Sie Fall - in der Regel unter starker Belastung - ähnlich wie die falsche multi-threaded Programme Verhalten können. Es muss nicht dein Fehler sein, um Ihr problem zu sein 🙂
Ehrlich gesagt, der einzige Weg, um sicher, dass der Fehler nicht in der Maschine X ist zum ausführen des Programms auf Rechner X. Ungewöhnliche Sachen, wie das erstellen und löschen Sie die gleiche Datei 8000-mal in rascher Folge ist anfällig für Fehler, auch wenn es "sollte" funktionieren. Computer, Betriebssysteme und APIs sind nicht perfekt. Die eher ungewöhnlichen Sachen, die Sie tun, desto häufiger wird die Unvollkommenheiten erkennen, die sich, weil ungewöhnliche Nutzung ist in der Regel weniger gründlich getestet wurden als der Alltag.
if(!file.getParentFile().canWrite()) System.out.println("parent file error");
wird nicht ausgeführt.Ich hatte das gleiche Problem, ein java-Programm (single threaded), das geöffnet wird, gelöscht, dann neu öffnet die gleiche Datei ständig.
Auf einigen windows-Systemen bekommen wir das gleiche Problem wie hier berichtet, auf Linux, Solaris und verschiedenen anderen windows-Systemen funktioniert es einwandfrei.
Traceing das Programm mit SysInternals Process Monitor (jetzt MS) seine klaren das löschen erfolgt zunächst auf OS-Ebene, und deaktivieren Sie das nachfolgende öffnen scheitert mit der PENDING DELETE-status.
Also es scheint eine leichte Verzögerung bei der OS/NTFS/Laufwerk-Ebene, bevor die Datei tatsächlich gelöscht wird, und das scheint die Ursache für die zufälligen Fehler in unserem Fall.
Als workaround, änderte ich das .delete () - Aufruf statt einfach schreiben über das top-neu FileWriter(Datei) und das scheint zu funktionieren.
Hab das problem nicht auftreten, auf allen Systemen, für ein bestimmtes Modell, dass würde immer scheitern, werden Sie es nach nicht feststehende Anzahl von Schleifen, war ein Windows 7 /Dell-Breite E6420 mit WD Smartdrive, in der Erwägung, dass mein Windows 7 /Dell precision M4600 (mit solid-state-drive) oder T3400 mit Linux hatte ich bisher nie das Problem.
Jubel - Mark
Es kann eine lange gedreht, aber, können Sie versuchen, die Arbeit mit einer Datei, die NICHT direkt sitzen auf dem Desktop. Statt:
Versuchen:
OS kann töten, Sie hier mit allen Desktop-Haken...
BEARBEITEN basierend auf den Kommentaren:
Können Sie bedingt versuchen, in die Datei schreiben ?
Mit Datei.existiert, und dann zu schreiben, so können Sie möglicherweise vermeiden Sie alle anderen Probleme. Schwer zu sagen, von dieser Ausnahme.
http://download.oracle.com/javase/6/docs/api/java/io/File.html#exists()
Könnte Sie auch ein thread-dump an diesem Punkt, nur um zu Debuggen weiter.
Bitte Spülen Sie den Schriftsteller, bevor Sie wieder zu schreiben.
if(!file.delete())
wird nicht ausgeführt. Wederif(file.exists())
die derzeit vor der Erstellung derFileWriter
close()
schließt den stream, Spülen Sie es zuerst. Damit explizit die Spülung sollte keinen Unterschied machen hier.Diese sind die scenerios sollte man behandeln, bevor eine Datei gelöscht, http://www.java2s.com/Code/Java/File-Input-Output/DeletefileusingJavaIOAPI.htm
zumindest prüfen, für die Rückkehr Wert in Ihrem Programm.
if(!file.delete())
wird nicht ausgeführt. Wederif(file.exists())
die derzeit vor der Erstellung derFileWriter
FileWriter
wieder in den catch-block. mit demselben Namen und unterschiedlichen auch.Vielen Dank Leute für die Hilfe ich heraus, aber dies ist, wie wurde es gelöst schließlich.
Ich hatte gerade das gleiche problem (FileWriter & Access Denied).
Meine Vermutung für den Grund: Windows-7 hatte eine Sperre auf die Datei, weil Sie eine Vorschau der Inhalt der Datei gezeigt wurde, in einem Explorer-Fenster (die Datei wurde ausgewählt).
Lösung: ich habe de ausgewählt, die Datei im Explorer-Fenster. Und die IOException war verschwunden.
Müssen Sie delete-Berechtigung in das Verzeichnis, aber nicht die Berechtigung "erstellen".