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.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
【讨论】:
嗯...是的忽略那个...检查此链接java.sun.com/javase/6/docs/api/java/awt/… ...open 抛出 IO 异常“如果指定的文件没有关联的应用程序或关联的应用程序无法启动” ...也从页面顶部...“注册、访问和启动相关应用程序的机制取决于平台。” PDF 文件在我的机器上有一个关联的应用程序,我不知道如何调试正在发生的事情。它只说“参数不正确”,这听起来像是 Microsoft COM/ActiveX 错误。以上是关于java.awt.Desktop.open 不适用于 PDF 文件?的主要内容,如果未能解决你的问题,请参考以下文章
为啥元类适用于类属性但@classmethod @property 不适用?
为啥 NSRegularExpression 不包含在适用于 Mac 应用程序的foundtion.framework 中,因为它适用于 iOS?