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

Posted

技术标签:

【中文标题】java.awt.Desktop.open 不适用于 PDF 文件?【英文标题】:java.awt.Desktop.open doesn’t work with PDF files? 【发布时间】:2009-10-06 18:04:47 【问题描述】:

看起来无论位置如何,我都无法在 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 的示例,请投票给它以提供帮助。多么痛苦。 >:(

【问题讨论】:

你应该真正编辑你原来的问题,而不是创建一个新问题。 有足够的编辑,我决定投票关闭我原来的问题+打开一个新问题。这个与 UNC 路径无关,我得到的唯一答案与 UNC 路径和空格有关。 事实上,更好的是:我已经删除了旧问题,因为它在这一点上没有任何价值。 【参考方案1】:

我从不知道这个桌面命令,直到最近才通过这篇文章:would Java's Runtime.getRuntime().exec() run on windows 7?

之前我一直在使用:

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

它一直对我有用。如果你的方法不起作用,也许你可以考虑试试这个命令。

【讨论】:

它有帮助,但仅适用于 Windows。 (我同时使用 MacOS 和 Windows。)【参考方案2】:

如果您切换参数的顺序,是否会导致其他文件之一出现相同的错误。我想知道在调用 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

【讨论】:

嗯...是的忽略那个...检查此链接java.sun.com/javase/6/docs/api/java/awt/… ...open 抛出 IO 异常“如果指定的文件没有关联的应用程序或关联的应用程序无法启动” ...也从页面顶部...“注册、访问和启动相关应用程序的机制取决于平台。” PDF 文件在我的机器上有一个关联的应用程序,我不知道如何调试正在发生的事情。它只说“参数不正确”,这听起来像是 Microsoft COM/ActiveX 错误。

以上是关于java.awt.Desktop.open 不适用于 PDF 文件?的主要内容,如果未能解决你的问题,请参考以下文章

为啥元类适用于类属性但@classmethod @property 不适用?

JavaScript 箭头函数:适用与不适用场景

WEKA:如何区分“缺失”和“不适用”的数字数据?

为啥 NSRegularExpression 不包含在适用于 Mac 应用程序的foundtion.framework 中,因为它适用于 iOS?

Nginx websocket 将适用于单个响应或根本不适用,似乎是随机的

mongodb适用和不适用的应用场景