我一直在用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文件复制到其他位置,但结果是一样的。
答案 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。