5

Mam problem z uruchomieniem tego. Bierze ciąg znaków, który składa się z kilku zebranych informacji. Jednak gdy próbuję napisać ciąg do pliku w celu śledzenia zmian w programie w czasie, otrzymam dostęp jest zabroniony błąd:Dostęp jest zabroniony podczas korzystania z FileOutputStream

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) 

Pełne 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) 

Linia 58:

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

Czy użytkownik, z którym uruchamiasz program, ma uprawnienia do tworzenia i zapisywania plików w tym katalogu? –

+0

To moje własne konto, które jest administratorem na moim komputerze. Mam wyłączone UAC dla siebie i jednego innego użytkownika na komputerze. –

+0

Mogę pomyślnie utworzyć plik, jeśli nie dodaję katalogów i nie umieściłem tego pliku bezpośrednio na dysku C: –

Odpowiedz

10

Musisz najpierw utworzyć foldery. Ale nie możesz wywołać file.mkdirs() - musisz wywołać file.getParentFile() .mkdirs() - w przeciwnym razie utworzysz folder z nazwą pliku (który uniemożliwi ci utworzenie pliku z to samo imię).

Wspomnę również, że powinieneś sprawdzić kod wynikowy mkdirs(), na wszelki wypadek, gdyby się nie udało.

I chociaż o to nie prosiłeś, nadal będę wspominał, że nie musisz wywoływać funkcji createNewFile() (Twój FileWriter ją utworzy).

i tylko dla dokładności, należy umieścić plik.close() w bloku finally i rzucać swój wyjątku (nie tylko wydrukować) - proszę bardzo:

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

Jest inna możliwość (tylko dla każdego, kto może to czytać po fakcie). Miałem ten sam problem, ale istniały wszystkie foldery nadrzędne. Problem polegał na tym, że istniał folder o tej samej nazwie, co plik, który próbowałem utworzyć.

+0

Nice! Świetna odpowiedź! Zaoszczędziłem mnóstwo czasu. – ryvantage