看起来我不能在PDF文件上使用Desktop.open()而不管位置如何。这是一个小测试程序:
package com.example.bugs;
import java.awt.Desktop;
import java.io.File;
import java.io.IOException;
public class DesktopOpenBug {
static public void main(String[] args)
{
try {
Desktop desktop = null;
// Before more Desktop API is used, first check
// whether the API is supported by this particular
// virtual machine (VM) on this particular host.
if (Desktop.isDesktopSupported()) {
desktop = Desktop.getDesktop();
for (String path : args)
{
File file = new File(path);
System.out.println("Opening "+file);
desktop.open(file);
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
如果我使用参数c:\tmp\zz1.txt c:\tmp\zz.xml c:\tmp\ss.pdf
运行DesktopOpenBug(我碰巧有3个文件)我得到了这样的结果:( .txt和.xml文件打开正常)
Opening c:\tmp\zz1.txt
Opening c:\tmp\zz.xml
Opening c:\tmp\ss.pdf
java.io.IOException: Failed to open file:/c:/tmp/ss.pdf. Error message:
The parameter is incorrect.
at sun.awt.windows.WDesktopPeer.ShellExecute(Unknown Source)
at sun.awt.windows.WDesktopPeer.open(Unknown Source)
at java.awt.Desktop.open(Unknown Source)
at com.example.bugs.DesktopOpenBug.main(DesktopOpenBug.java:21)
到底发生了什么事?我正在运行WinXP,我可以在命令提示符下键入“c:\ tmp \ ss.pdf”,它打开就好了。
修改:如果这是Sun Java bug #6764271的示例,请通过投票来提供帮助。太痛苦了。 >:(
答案 0 :(得分:8)
我从来不知道这个桌面命令,直到最近通过这篇文章:
would Java's Runtime.getRuntime().exec() run on windows 7?
以前我一直在使用:
Runtime.getRuntime().exec("rundll32 SHELL32.DLL,ShellExec_RunDLL "+ myfile);
它一直对我有用。如果你的方法不起作用,你可以考虑尝试这个命令。
答案 1 :(得分:2)
如果你切换你的arugments的顺序,那会导致其他一个文件得到同样的错误。我想知道在调用File构造函数之前是否需要修剪路径的末尾。
Desktop.open
。 open
抛出IO异常“如果指定的文件没有关联的应用程序或关联的应用程序无法启动”...也来自页面顶部......“注册,访问和启动的机制相关的应用程序依赖于平台。“
桌面类的代码:http://fuseyism.com/classpath/doc/java/awt/Desktop-source.html
open方法调用DesktopPeer.open
。
DesktopPeer来源:http://www.jdocs.com/javase/7.b12/java/awt/peer/DesktopPeer.html
DesktopPeer是特定于实现的。
以下是Windows特定实现的来源: http://www.java2s.com/Open-Source/Java-Document/6.0-JDK-Platform/windows/sun/awt/windows/WDesktopPeer.java.htm
open->ShellExecute->(Native)ShellExecute
Native ShellExecute
是Win32 ShellExecute
的包装器。这是关于功能的信息。
http://msdn.microsoft.com/en-us/library/bb762153(VS.85).aspx
我对解决方法的建议是编写自己的ShellExecute函数实现。这是来自某人的来源。 http://www.heimetli.ch/shellexec.html