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

스택 트레이스 YEILDS :

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

프로그램을 실행중인 사용자가 해당 디렉토리에 파일을 만들고 쓰는 권한을 가지고 있습니까? –

+0

내 컴퓨터의 관리자 인 내 계정입니다. 나는 UAC를 나 자신과 다른 한 명의 사용자가 컴퓨터에서 끄도록했다. –

+0

디렉터리를 추가하지 않고 파일을 디스크 C에 직접 넣으면 성공적으로 파일을 만들 수 있습니다. –

답변

10

먼저 폴더를 만들어야합니다. 그러나 file.mkdirs()를 호출 할 수 없습니다. file.getParentFile(). mkdirs()를 호출해야합니다. 그렇지 않으면 파일의 이름을 가진 폴더를 만듭니다. 그러면 파일을 만들지 못하게됩니다. 같은 이름).

또한 mkdirs()의 결과 코드를 확인해야합니다. 실패 할 경우를 대비해 설명합니다.

그리고 물어 보지는 않았지만 createNewFile()을 호출 할 필요가 없다고 언급 할 것입니다 (FileWriter가 생성 할 것임).

하고, 단지 철저를 들어, finally 블록에 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