Zugriff verweigert taucht sporadisch auf bei Dateizugriffen

Wundfix

Grünschnabel
Hi Leute,

hab folgendes Problem:
ich hab eine Klasse erstellt die mir eine art ConfigurationsDatei erstellen soll. Also hab ich paar Werte die ich schreiben will und diese ConfigDatei ruf ich dann zu verschiedenen Punkten des Programs auf, eben da wo sich Configurationsparameter ändern.

also gibts in der Klasse eine schreiben-Methode die den Inhalt der Klasse zeilenweise in die Datei drückt. Nach dem schreiben mach ich den BufferedWriter wieder zu(close()).

Java:
public class FileOperations() {

    String eins = "";
    String zwei = "";
    String drei = "";

    FileOperations(String eins, String zwei, String drei) {
        //Zuweisungen hier
    }

    public void writeFile() {

        FileWriter fw = new FileWriter("Dateiname");
        BufferedWriter bw = new BufferedWriter(fw);

        bw.write(eins);
        bw.newline();
        bw.write(zwei);
        bw.newline();
        bw.write(drei);
        bw.flush();
        bw.close();
    }

}

Beim ersten aufruf gibts eigentlich nie Probleme ... er tut was er soll und schreibt artig.
Wenn ich dann von anderen(oder auch nochmal von der gleichen Stelle) was zu speichern versuche schmeisst er mir eine Exception FileNotFoundException Dateiname (Zugriff verweigert).
Lustig ist auch dass, wenn ich das durchdebugge tritt der Fehler nie auf.

Ich tippe irgendwie darauf das der zweite(oder dritte) zugriff zu schnell erfolgt und er die Datei noch nicht wieder freigegeben hat. Aber ich hab das auch mal so umgebaut das nur noch am Ende einmal geschrieben wird. Wenn ich das Programm dann mehrmals hintereinander starte hab ich das gleiche Problem. Natürlich schliesse ich das vorhergehende Programm immer da ja nur dann gespeichert wird.

Danke schonmal für eure Hilfe
 
Zuletzt bearbeitet:
1) Da du ja schon ETWAS länger hier bist :
1a) bitte JAVA-Tags *Signatur* verwenden
1b) bitte ein wenig auf die Schreibweise achten ...
1c) Den Code wenigstens grob formatieren .. *ohne Einrückung erkennt man nur schwer wo was anfängt und was aufhört*

2) Für genau sowas gibt es in Java die Klasse java.util.Properties. Damit kannst du deine Einstellungen auch aus einem File laden und in ein File schreiben ... und musst dich nicht über irgendwelche Streams kümmern. Das macht Properties alleine.
Alternativ bietet Properties sogar XML unterstützung an.

3) ACCESS DENIED tritt meistens auf wenn du versuchst in eine Datei / Verzeichnis zu schreiben für das du keine Rechte hast.
Ich frage jetzt ganz bewusst und es wäre hilfreich wenn du so genau Angaben wie möglich lieferst :

Welches OS ?
Welche Java Version ?
User-Rechte ?
In welches Verzeichnis / welche Datei willst du speichern ? *Bitte KOMPLETTEN Pfad angeben !*
Funktioniert es bei anderen ?
 
hi SPIKEe,

Properties schau ich mir mal an.

Access denied ist schon irgendwie klar das es mir Rechten zu tun hat. Aber ich hab ja scheinbar die Rechte zu schreiben, da es ja regelmäßig geht. Und dann halt mal nicht mehr. Und ich geh mal davon aus das mir zwischenzeitlich keiner an den rechten geschraubt hat.

OS ist Win XP Pro SP3
Java ist JRE 7 und JDK 1.7
User-Rechte sind standardmäßig beschränkt aber auch als Admin tritt das auf
Der absolute Pfad ist c:/Dokumente und Einstellungen/wundfix/workspace/projekt/.wundfix

Ich hab es jetzt erstmal so lösen können das ich vor dem erneuten Schreiben die Configdatei(.wundfix) lösche. hab also nur vor den FileWriter geschrieben:
Java:
if(file.exists()) {
    file.delete();
}
der Rest des Codes bleibt gleich

andere Benutzer hab ich hier grad nicht zur verfügung, daher kA obs bei anderen geht :)
 
Hmm ...
Also laut Pfad schreibst du in deinen User-Space ... wofür du auf jeden Fall volle Rechte hast ... *zumindest unter XP =D*.

Was ich jetzt noch vermuten würde *auch wenn ich mir das nur sehr schwer vorstellen kann* ist das es Probleme zwischen BufferedReader/Writer und FileReader/Writer gibt.
In der Regel wird beim close() eines BufferedReader/Writer der zugrundeliegende Input/OutputStream ebenfalls geschlossen und die Resource wieder freigegeben.

Und selbst wenn ich versuchen würde deinen Code irgendwie nachzuvollziehen würde ich es erstmal radikal ändern in folgendes :
Java:
File file=new File("File");
OutputStream out=new FileOutputStream(file);
PrintStream pout=new PrintStream(out);
und würde die Daten zeilenweise mit
Java:
pout.println(String);
rausschreiben.

Von diesem ganzen Buffered-kram halte ich persönlich sowieso nur sehr wenig. Auch von den Reader/Writer-Klassen da diese nur auf text/plain ausgelegt sind *maximal noch eine Encoding-Unterstützung haben* ... ich es aber sehr oft mit Binär-Streams zutun habe.

Bevor du also so radikal ein File.delete() einfügst würde ich es erstmal mit einem expliziten FileWriter.close() versuchen ... wobei das eigentlich schon durch den BufferedWriter geschehen sollte.

Das ganze ist eher schwammig da ich mir
1) noch nicht mal die Mühe machen und versuchen würde sowas selbst zu schreiben ... dafür gibt es wie gesagt Properties
2) wenn überhaupt nur mit Binär-Streams arbeiten würde ... und das ganze auch un-buffered
3) würde ich vielleicht sogar ein RandomAccessFile verwenden und mir bequem über NIO File- und Stream-Channels holen ...
 

Neue Beiträge

Zurück