Java - IOException:无法打开文件:访问被拒绝

时间:2012-07-01 18:54:30

标签: java ioexception

我一直在用Java开发一些软件,这些软件将被分发用于Windows或MacOS。我目前正在使用iMac进行编程(因为Apple的具体要求)。以下方法从资源中拖出一个帮助文件(.pdf)并将其复制到本地,以便它可以显示在本地计算机上。

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上运行良好,但在Windows 7上提供IOException

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

知道这里出了什么问题吗?我已经尝试将.pdf文件复制到其他位置,但结果是一样的。

3 个答案:

答案 0 :(得分:2)

在Windows上运行时程序的工作目录是什么?运行程序的用户上下文可能无权写入c:\Program Files\

您没有指定文件的路径,所以我的假设是c:\program files\brc\是运行程序时的工作目录。从Windows Vista开始,您需要具有完全管理权限才能写入Program Files和其他目录。

更新日期:7/1/2012

好的,我能够将你的程序存根并作为主类运行,并且能够在Windows 7上打开Desktop.getDesktop().open(f); PDF文件。我手动将PDF文件放入Eclipse的bin目录中将我的类文件编译为。

我现在需要尝试将类文件和pdf移动到c:\program files\的子目录中,看看我是否收到了您收到的拒绝访问权限。

嗯,我能够Desktop.getDesktop().open(f);c:\program files\test\中打开PDF文件,请参阅下面的输出:

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?我的是java version "1.7.0_01" Java(TM) SE Runtime Environment (build 1.7.0_01-b08)

答案 1 :(得分:0)

我同意HeatfanJohn,这绝对是一个许可问题。

尝试从命令行以管理员身份编译Java代码。只需以管理员身份运行cmd.exe,然后再次尝试编译/运行。

答案 2 :(得分:0)

我遇到了同样的问题。不知道原因,但找到了解决方案。

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

只有在桌面方法失败时才应使用此功能,因为这仅适用于Windows。