3

我一直在用 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 上运行良好,但IOException在 Windows 7 上运行良好:

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

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

4

3 回答 3

2

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

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

更新日期:2012 年 7 月 1 日

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

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

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

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)

于 2012-07-01T19:03:44.753 回答
0

I'm experiencing the same issue. Don't know the reason, but found a solution.

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

you should use this only if the Desktop method fails, because this is only for Windows.

于 2014-12-06T23:28:13.453 回答
0

我同意 HeatfanJohn 的观点,这绝对是一个权限问题。

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

于 2012-07-01T19:28:05.810 回答