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