2012-07-01 3 views
3

저는 Java로 Windows 또는 MacOS에서 사용하기 위해 배포되는 일부 소프트웨어를 개발해 왔습니다. 나는 애플 특유의 요구 때문에 순간에 아이맥으로 프로그래밍하고있다. 다음 방법은 도움말 파일 (.pdf)을 리소스에서 끌어와 로컬 컴퓨터에 표시 할 수 있도록 로컬로 복사합니다.Java - IOException : 파일을 열지 못했습니다 : 액세스가 거부되었습니다.

private void mHelpActionPerformed(java.awt.event.ActionEvent evt) {          
    String sourceFile = "resources/BRC2Help.pdf"; 
    String destFile = "brc2help.pdf"; 
    File f = new File (destFile); 
    if (!f.exists()) { 
      try { 
      URL url = ClassLoader.getSystemResource(sourceFile) ; 
      InputStream is = url.openStream(); 
      OutputStream os = new FileOutputStream(destFile); 
      byte[] b = new byte[2048]; 
      int length; 
      while ((length = is.read(b)) != -1) { 
       os.write(b, 0, length); 
      } 
      is.close(); 
      os.close(); 
      System.out.printf("loaded pdf file from resources: %d bytes\n",f.length()); 
      } catch (IOException ex) {System.out.printf("loadPDF: %s\n",ex);} 
    } else { 
     System.out.printf("%s exists: %d bytes\n",destFile,f.length()); 
    } 

    try { 
     if (f.exists()) { 
       f.setReadable(true); 
       if (Desktop.isDesktopSupported()) { 
       Desktop.getDesktop().open(f); 
      } else { 
       System.out.println("Awt Desktop is not supported!"); 
      } 
     } 
    } catch (Exception ex) { 
     JOptionPane.showMessageDialog(this, 
       String.format("%s\n",ex), 
       "Helpfile Problem?", 
       JOptionPane.ERROR_MESSAGE); 
    } 
}          

모든 Mac에서 충분히 잘 작동하지만 윈도우 7상의 IOException을 제공이 :

java.io.IOException: Failed to open file:/C:/Program%20Files/BRC2/brc2help.pdf. Error message: Access denied.

어떤 생각이 잘못 여기서 뭐하는거야? .pdf 파일을 다른 위치로 복사하려고 시도했지만 결과는 같습니다.

+0

필자는 비슷한 문제를 겪었으며 경로 이름의 공백과 관련이있는 것으로 보입니다. 지금 당장은 JDK에서 문제가 될 수 있다고 생각합니다. Desktop.open()에서도 발생하므로 URI 디코딩 문제 일 수 있습니다. Mac OS X에서 제대로 작동합니다. –

답변

2

Windows에서 실행할 때 프로그램의 작업 디렉토리는 무엇입니까? 프로그램을 실행하는 사용자 컨텍스트에 c:\Program Files\에 쓸 수있는 권한이 없을 수 있습니다.

파일 경로를 지정하지 않았으므로 프로그램을 실행하는 동안 c:\program files\brc\이 작업 디렉토리임을 가정합니다. Windows Vista 이후로 Program Files 및 기타 디렉토리에 쓸 수 있으려면 전체 관리 권한이 있어야합니다.

업데이트 : 2012년 7월 1일이

좋아, 나는 당신의 프로그램을 스텁과 메인 클래스로 실행 할 수 있었다 엽니 윈도우 7 수동 I에 PDF 파일을 Desktop.getDesktop().open(f);을 할 수 있었다 Eclipse가 내 클래스 파일을 컴파일 한 bin 디렉토리에 PDF 파일을 넣으십시오.

이제 클래스 파일과 pdf를 c:\program files\의 하위 디렉토리로 이동하고 액세스가 거부 된 예외가 발생하는지 확인해야합니다.

C:\Program Files\test>"\Program Files (x86)\Java\jre7\bin\java.exe" MyTestClass 
brc2help.pdf exists: 943123 bytes 

C:\Program Files\test>dir 
Volume in drive C is OS 
Volume Serial Number is 2035-793F 

Directory of C:\Program Files\test 

07/01/2012 10:25 PM <DIR>   . 
07/01/2012 10:25 PM <DIR>   .. 
07/01/2012 09:55 PM   943,123 BRC2Help.pdf 
07/01/2012 09:57 PM    2,391 MyTestClass.class 
       2 File(s)  945,514 bytes 
       2 Dir(s) 567,516,254,208 bytes free 

JRE를 사용하는 것 :

흠, 나는 그것이 c:\program files\test\에있을 때, 아래에있는 내 출력을 볼 수 Desktop.getDesktop().open(f);가 PDF 파일을 열 얻을 수 있었다? 내 것은 java version "1.7.0_01" Java(TM) SE Runtime Environment (build 1.7.0_01-b08)

+0

작업 디렉토리는 c : \ Program Files \ BRC \ Writing이 문제가되지 않습니다. .pdf 파일은 작업 디렉토리에 충분히 복사됩니다. 단지 읽을 수 없습니다. .pdf 파일을 두 번 클릭하면 Adobe Reader에서 완벽하게 표시합니다. – user1494618

+0

약간의 일을 명확히하기 위해 ...JAR 파일은 먼저 exe4j 랩퍼에 랩핑되며 결과 실행 파일은 Inno 설치 배포 랩퍼에 랩핑됩니다. 그러나 원본 폴더 (내 Windows PC에서 Mac에서 복사)를 따라 가며 "java -jar BRC.jar"로 프로그램을 시작하면 .pdf를 보도록 요청할 때까지 모든 올바른 작업을 수행합니다. . 정확히 똑같은 방식으로 실패 할 때. – user1494618

+0

@ user1494618 여기에 붙여 넣은 코드 줄 중 예외를 생성하는 줄을 알고 있습니까? 파일이 디렉토리에 쓰여지고 있다고 말하면 예외가 발생하는 것은'Desktop.getDesktop(). open (f);'입니까? – HeatfanJohn

0

나는 HeatfanJohn에 동의합니다. 그것은 확실히 허가 문제입니다.

Java 코드를 관리자 권한으로 명령 줄에서 컴파일 해보십시오. 단순히 cmd.exe를 관리자로 실행 한 다음 다시 컴파일/실행하십시오.

+0

문제는 메뉴 모음 등을 다루는 모든 OSX 관련 내용 때문에 Windows PC에서 코드를 컴파일 할 수 없다는 것입니다. 라이브러리를 사용할 수 없습니다. 당신이 할 수있는 방법을 알지 못하면 ... – user1494618

+0

내 응용 프로그램이 C : \ Program Files \ BRC \ 디렉토리에 복사 된 .pdf 파일과 관련된 사용 권한을 보면 Windows가 다음과 같이 말합니다 : SYSTEM : Full 제어; 관리자 : 모든 권한; 사용자 : 읽기 및 실행 ... 현재 Administrators (및 나)가 소유하고 있습니다. 그게 당신이 의미 한 것입니까? – user1494618

+0

오류 메시지에 대해 두 가지로 귀찮게합니다 : (1) 드라이브 문자 앞에 '/', (b) '프로그램'과 '파일'사이의 공간을 나타내는 '% 20'. 관련성이있는 것으로 생각하나요? – user1494618

0

동일한 문제가 발생합니다. 이유를 모르지만 해결책을 찾았습니다.

Runtime.getRuntime().exec("rundll32 SHELL32.DLL,ShellExec_RunDLL \"" + StringEscapeUtils.escapeJava(f.getAbsolutePath()) + "\""); 

데스크톱 방법이 실패한 경우에만 사용해야합니다.이 방법은 Windows에만 해당되므로이 방법을 사용해야합니다.