5

У меня возникла проблема с тем, чтобы это работало. Он берет строку, состоящую из нескольких частей информации, собранных вместе. Однако, когда я пытаюсь записать строку в файл, чтобы отслеживать изменения в программе в течение долгого времени, я получаю доступ запрещен сообщение об ошибке:Доступ запрещен при использовании 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) 

Полный 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:

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

Использует ли пользователь программу, которая имеет права создавать и записывать файлы в этот каталог? –

+0

Это моя собственная учетная запись, которая является администратором моего компьютера. Я отключил UAC для себя и другого пользователя на компьютере. –

+0

Я могу создать файл, если я не добавляю каталоги и размещаю файл непосредственно на диске. C: –

ответ

10

Сначала вы должны создать папки. Но вы не можете вызвать file.mkdirs() - вам нужно вызвать file.getParentFile(). Mkdirs() - в противном случае вы создадите папку с именем файла (которая тогда не позволит вам создать файл с одно и то же имя).

Я также упомянул, что вы должны проверить код результата mkdirs(), на всякий случай, если он терпит неудачу.

И хотя вы не просили об этом, я все равно буду упоминать, что вам не нужно вызывать createNewFile() (ваш FileWriter его создаст).

и просто для тщательности, обязательно поставить file.close() в блоке, наконец, и бросать исключение (не просто напечатать) - здесь вы идете:

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

Там в другая возможность (только для тех, кто может читать это после факта). У меня была та же проблема, но все родительские папки существовали. Проблема оказалась в том, что была папка с тем же именем, что и файл, который я пытался создать.

+0

Ницца! Отличный ответ! Сэкономил много времени. – ryvantage

Смежные вопросы