Доступ запрещен при использовании 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();
    }

ДОХОДНОСТЬ СТЕКТРЕЙСА:

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

Полная трассировка стека:

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));

person Nick    schedule 02.09.2013    source источник
comment
Есть ли у пользователя, от имени которого вы запускаете программу, разрешения на создание и запись файлов в этот каталог?   -  person NG.    schedule 03.09.2013
comment
Это моя собственная учетная запись, которая является администратором на моем компьютере. Я отключил UAC для себя и еще одного пользователя на компьютере.   -  person Nick    schedule 03.09.2013
comment
Я могу успешно создать файл, если не добавляю каталоги и помещаю файл непосредственно на диск C:   -  person Nick    schedule 03.09.2013
comment
Каталог существует? У вас есть права на запись для создания каталога и записи файла?   -  person MadProgrammer    schedule 03.09.2013
comment
папка WeatherExports уже существует на диске C:?   -  person Sean F    schedule 03.09.2013
comment
Каталог не существует. Я пытаюсь его создать. Первоначально у меня было: file.mkdirs(); файл.создатьНовыйФайл();   -  person Nick    schedule 03.09.2013
comment
BufferedWriter не отображается в трассировке стека и поэтому не имеет к нему никакого отношения.   -  person user207421    schedule 03.09.2013
comment
Жаль, что это та строка, на которой возникла ошибка, сэр.   -  person Nick    schedule 03.09.2013
comment
Жаль, что BufferedWriter не отображается в трассировке стека. Каково ваше объяснение этому? Жаль, что упомянутая вами строка также содержит new FileWriter(),, который действительно появляется в трассировке стека. Жаль, что вы не ознакомились должным образом со своими собственными доказательствами, прежде чем публиковать. Или комментировать.   -  person user207421    schedule 03.09.2013
comment
stackoverflow.com/a/23697734/715269   -  person Gangnus    schedule 16.05.2014


Ответы (3)


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

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

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

и, просто для тщательности, обязательно поместите свой файл.close() в блок finally и сгенерируйте свое исключение (не просто распечатайте его) - вот оно:

 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();
            } 
    }
person Kevin Day    schedule 03.09.2013

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

person k_g    schedule 21.12.2013
comment
Хороший! Отличный ответ! Сэкономил мне много времени. - person ryvantage; 26.03.2016

В моем случае я передавал каталог, в который я должен поместить файл, который я генерирую. Я просто добавил имя файла в каталог, и мой работал нормально.

person Leroy    schedule 06.03.2020