5

Ich habe ein Problem, das zu arbeiten. Es nimmt eine Zeichenfolge auf, die aus mehreren zusammengesetzten Informationen besteht. Allerdings, wenn ich versuche, den String in eine Datei zu schreiben, um Änderungen im Programm im Laufe der Zeit zu verfolgen, erhalte ich ein Zugriffsfehler verweigert:Zugriff verweigert, wenn FileOutputStream verwendet wird

void writeToFile(String input) throws Exception{ 
      File file = new File("C:\\WeatherExports\\export.txt"); 
      if(!file.exists()){ 
        file.createNewFile(); 
      } 
      BufferedWriter inFile = new BufferedWriter(new FileWriter(file,true)); 
      try{ 
        inFile.append(input); 
        inFile.newLine(); 
      } catch(Exception e){ 
        e.printStackTrace(); 
      } 
      inFile.close(); 
    } 

STACKTRACE yeilds:

java.io.FileNotFoundException: C:\WeatherExports\export.txt (Access is denied) 

Voll Stacktrace:

java.io.FileNotFoundException: C:\WeatherExports\export.txt (Access is denied) 
at java.io.FileOutputStream.openAppend(Native Method) 
at java.io.FileOutputStream.<init>(Unknown Source) 
at java.io.FileWriter.<init>(Unknown Source) 
at org.weatheralert.InfoManipMethods.writeToFile(InfoManipMethods.java:58) 
at org.weatheralert.Form.actionPerformed(Form.java:108) 
at javax.swing.JTextField.fireActionPerformed(Unknown Source) 
at javax.swing.JTextField.postActionEvent(Unknown Source) 
at javax.swing.JTextField$NotifyAction.actionPerformed(Unknown Source) 
at javax.swing.SwingUtilities.notifyAction(Unknown Source) 
at javax.swing.JComponent.processKeyBinding(Unknown Source) 
at javax.swing.JComponent.processKeyBindings(Unknown Source) 
at javax.swing.JComponent.processKeyEvent(Unknown Source) 
at java.awt.Component.processEvent(Unknown Source) 
at java.awt.Container.processEvent(Unknown Source) 
at java.awt.Component.dispatchEventImpl(Unknown Source) 
at java.awt.Container.dispatchEventImpl(Unknown Source) 
at java.awt.Component.dispatchEvent(Unknown Source) 
at java.awt.KeyboardFocusManager.redispatchEvent(Unknown Source) 
at java.awt.DefaultKeyboardFocusManager.dispatchKeyEvent(Unknown Source) 
at java.awt.DefaultKeyboardFocusManager.preDispatchKeyEvent(Unknown Source) 
at java.awt.DefaultKeyboardFocusManager.typeAheadAssertions(Unknown Source) 
at java.awt.DefaultKeyboardFocusManager.dispatchEvent(Unknown Source) 
at java.awt.Component.dispatchEventImpl(Unknown Source) 
at java.awt.Container.dispatchEventImpl(Unknown Source) 
at java.awt.Window.dispatchEventImpl(Unknown Source) 
at java.awt.Component.dispatchEvent(Unknown Source) 
at java.awt.EventQueue.dispatchEventImpl(Unknown Source) 
at java.awt.EventQueue.access$000(Unknown Source) 
at java.awt.EventQueue$1.run(Unknown Source) 
at java.awt.EventQueue$1.run(Unknown Source) 
at java.security.AccessController.doPrivileged(Native Method) 
at java.security.AccessControlContext$1.doIntersectionPrivilege(Unknown Source) 
at java.security.AccessControlContext$1.doIntersectionPrivilege(Unknown Source) 
at java.awt.EventQueue$2.run(Unknown Source) 
at java.awt.EventQueue$2.run(Unknown Source) 
at java.security.AccessController.doPrivileged(Native Method) 
at java.security.AccessControlContext$1.doIntersectionPrivilege(Unknown Source) 
at java.awt.EventQueue.dispatchEvent(Unknown Source) 
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source) 
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source) 
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source) 
at java.awt.EventDispatchThread.pumpEvents(Unknown Source) 
at java.awt.EventDispatchThread.pumpEvents(Unknown Source) 
at java.awt.EventDispatchThread.run(Unknown Source) 

58 Line:

BufferedWriter inFile = new BufferedWriter(new FileWriter(file,true)); 
+1

Verfügt der Benutzer, dem Sie das Programm ausführen, über Berechtigungen zum Erstellen und Schreiben von Dateien in dieses Verzeichnis? –

+0

Es ist mein eigener Account, der ein Admin auf meinem Computer ist. Ich habe UAC für mich und einen anderen Benutzer auf dem Computer deaktiviert. –

+0

Ich kann die Datei erfolgreich erstellen, wenn ich keine Verzeichnisse hinzufüge und die Datei direkt in den Datenträger C lege: –

Antwort

10

Sie müssen Ordner zuerst erstellt haben. Aber Sie können file.mkdirs() nicht aufrufen - Sie müssen file.getParentFile(). Mkdirs() aufrufen - andernfalls erstellen Sie einen Ordner mit dem Namen der Datei (der Sie dann daran hindert, eine Datei mit zu erstellen der selbe Name).

Ich werde auch erwähnen, dass Sie den Ergebniscode von mkdirs() überprüfen sollten, nur für den Fall, dass es fehlschlägt.

Und obwohl Sie nicht danach gefragt haben, werde ich immer noch erwähnen, dass Sie nicht createNewFile() aufrufen müssen (Ihr FileWriter wird es erstellen).

und nur für Gründlichkeit, sollten Sie Ihre file.close() in einem finally-Block zu setzen, und Ihre Ausnahme auslösen (es ist nicht nur drucke) - hier geht:

void writeToFile(String input) throws IOException{ 
      File file = new File("C:\\WeatherExports\\export.txt"); 
      if (!file.getParentFile().mkdirs()) 
        throw new IOException("Unable to create " + file.getParentFile()); 
      BufferedWriter out = new BufferedWriter(new FileWriter(file,true)); 
      try{ 
        out.append(input); 
        out.newLine(); 
      } finally { 
        out.close(); 
      } 
    } 
6

dort ist eine andere Möglichkeit (nur für jeden, der dies nach der Tat liest). Ich hatte das gleiche Problem, aber alle übergeordneten Ordner existierten. Das Problem bestand darin, dass es einen Ordner mit demselben Namen wie die Datei gab, die ich erstellen wollte.

+0

Schön! Gute Antwort! Sparte mir viel Zeit. – ryvantage

Verwandte Themen