如何使用 Java 中的锚启动文件协议 URL?
Posted
技术标签:
【中文标题】如何使用 Java 中的锚启动文件协议 URL?【英文标题】:How to launch a file protocol URL with an anchor from Java? 【发布时间】:2010-09-22 23:10:04 【问题描述】:从 Java 程序中,我需要在本地 html 文件上启动默认浏览器,指向文件内的锚点。在 Java SE 6 中,java.awt.Desktop.browse 方法将打开文件,但不会尊重锚点,因此类似以下内容会在顶部打开文件,但不会将浏览器分页到锚点:
Desktop.getDesktop("file:///C:/foo/bar.html#anchor");
Sun 在这里说 http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6477862 文件 URI 协议不支持锚点。
谁有更好的答案?
我可以使用 Java SE 6。我可以使用仅限 Windows 的解决方案。
【问题讨论】:
【参考方案1】:我只是以另一种方式解决了这个问题,因为这些示例中的任何引用或空格都不适合我。
1 检测文件 URI 是否有锚点或查询字符串
2 如果是这样,请创建一个临时文件 File tmpfile = File.createTempFile("apphelp", ".html")
,并将元重定向到我想要的实际文件 URI:
<html><head>
<meta http-equiv="refresh" content="0;url=help.html#set_filter" />
</head></html>
3 使用新的临时 URI 执行本地 rundll 命令:
Runtime.getRuntime().exec(
"rundll32 url.dll,FileProtocolHandler \""
+tmpfile.toURI().toString()+ "\"");
我希望这对你有用!
【讨论】:
这也适用于Desktop.browse()
- 至少在 Windows 上【参考方案2】:
Windows 上的解决方案是:
rundll32 URL.dll, FileProtocolHandler "file:///x:/temp/fragtest.htm#frag"
注意引号!!!
rundll32 URL.dll, FileProtocolHandler file:///x:/temp/fragtest.htm#frag 确实按预期工作。
【讨论】:
【参考方案3】:仅适用于 Windows,您可以尝试
System.exec("cmd.exe start file:///C:/foo/bar.html#anchor")
【讨论】:
【参考方案4】:您可以尝试使用BrowserLauncher2。它是一个小型且独立的跨平台库,用于打开默认浏览器。它可以完美地处理锚点。
【讨论】:
在 Windows 7 中对我不起作用,锚已被剥离。我认为这是一个操作系统问题,ProcessMonitor 显示我在没有锚点的情况下对 Firefox 的调用。 虽然这可能是解决问题的宝贵提示,但一个好的答案也可以证明解决方案。请edit 提供示例代码来说明您的意思。或者,请考虑将其写为评论。【参考方案5】:我已经对此项目 here 进行了一些调查 - 请注意,打开 cmd
并输入 start file:///c:/temp/test.html#anchor
也不起作用。
我认为唯一真正有效的方法是手动调用浏览器(或使用第三方工具)。
在 Windows 上,您始终拥有 Internet Explorer,因此如果您真的不想自己查找 iexplore.exe,可以致电 Runtime.getRuntime().exec("cmd.exe start iexplore " + myURL)
- 但这并不总是有效。
【讨论】:
以上是关于如何使用 Java 中的锚启动文件协议 URL?的主要内容,如果未能解决你的问题,请参考以下文章
Javascript/jQuery - 使用正则表达式解析字符串中的主题标签,URL 中的锚点除外