java.awt.Desktop.open不能用于PDF文件?

看起来我不能在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 (我碰巧有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的一个例子,请通过投票帮助它。 多么痛苦。 > 🙁

我从来不知道这个桌面命令,直到最近通过这篇文章:
Java的Runtime.getRuntime()。exec()会在Windows 7上运行吗?

以前我一直在使用:

 Runtime.getRuntime().exec("rundll32 SHELL32.DLL,ShellExec_RunDLL "+ myfile); 

它一直对我有用。 如果您的方法不起作用,可能您可以考虑尝试此命令。

如果你切换你的arugments的顺序会导致其他一个文件得到同样的错误。 我想知道在调用File构造函数之前是否需要修剪路径的末尾。

嗯…是的,请忽略…查看Desktop.open的文档 。 open抛出IOexception“如果指定的文件没有关联的应用程序或关联的应用程序无法启动”…也从页面顶部…“注册,访问和启动相关应用程序的机制是平台依赖。“


Desktop类的代码: 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的包装器。 这是关于function的信息。 http://msdn.microsoft.com/en-us/library/bb762153(VS.85).aspx

我对解决方法的建议是编写自己的ShellExecute函数实现。 这是来自某人的来源。 http://www.heimetli.ch/shellexec.html