Desktop.open()在某些JRE上静默失败

时间:2014-03-15 01:05:58

标签: java desktop

我正在尝试使用Desktop类在Windows上打开本地HTML文件。但它只适用于某些特定的JRE,而不适用于其他一些JRE。 这是我的代码:

try {
    if (Desktop.isDesktopSupported()) {
        Desktop desktop = Desktop.getDesktop();
        if (desktop.isSupported(Desktop.Action.OPEN)) {
            desktop.open(new File("test.html"));
        } else {
            throw new Exception("OPEN action not supported");
        }
    } else {
        throw new Exception("Desktop not supported");
    }
} catch (Exception e) {
    e.printStackTrace();
}

当它不起作用时,不会抛出异常,也不会在STDERR中打印文本。

适用于:

  • JRE 1.6.0_14(32位)
  • JRE 1.7.0_05(32位)
  • JRE 1.7.0_45(64位)
  • JRE 1.7.0_51(64位)

使用:

  • JRE 1.6.0_26(64位)
  • JRE 1.6.0_37(64位)
  • JRE 1.7.0_02(64位)
  • JRE 1.7.0_21(64位)编辑:但适用于CentOS

所有测试均在同一个Win7 64位盒上进行。

编辑:尝试打开“txt”或“pdf”文件时出现同样的问题

谢谢。

2 个答案:

答案 0 :(得分:5)

这个问题已经存在了一段时间,并且已经记录了一些解决方案at this blog.

我已经使用了下面的代码,并且无论JRE如何,它在我使用过的每台Windows机器上都是可靠的。对不起,我不知道我测试过的所有JRE。

Runtime.getRuntime().exec("rundll32 url.dll,FileProtocolHandler " + path);

答案 1 :(得分:1)

正如“Stijn de Witt”“hasntchecked”的回答中所说的那样,基于Runtime.getRuntime()的解决方案不适用于UNC路径,以及包含连续空格的路径。以下解决方案也适用于这些特殊路径:

new ProcessBuilder("rundll32", "url.dll,FileProtocolHandler", path).start();