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

时间:2009-10-06 18:04:47

标签: java desktop

看起来我不能在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的示例,请通过投票来提供帮助。太痛苦了。 >:(

2 个答案:

答案 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构造函数之前是否需要修剪路径的末尾。

嗯...是的,请忽略......检查the documentation of Desktop.openopen抛出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