如何在Java中使用锚点启动文件协议URL?

12
从Java程序中,我需要在本地HTML文件中启动默认浏览器,指向文件内的一个锚点。在Java SE 6中,java.awt.Desktop.browse方法将打开文件,但不会遵守锚点,所以像下面这样打开文件时会在顶部显示,但不会将浏览器定位到锚点处:
Desktop.getDesktop("file:///C:/foo/bar.html#anchor");

Sun在这里说https://bugs.java.com/bugdatabase/view_bug?bug_id=6477862文件URI协议不支持锚点。
有没有更好的答案?
我可以使用Java SE 6。我可以接受仅限Windows的解决方案。
5个回答

4

我用另一种方法解决了这个问题,因为在这些例子中引用或空格的数量对我都没有用。

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()+ "\"");

我希望这对你有用!

1
这也适用于 Desktop.browse() - 至少在 Windows 上。 - user330315
也适用于Linux(至少在Linux Mint上),但是通过Desktop.getDesktop().open(htmlFile); - Sergey Karpushin

1

在Windows上的解决方案是:

rundll32 URL.dll, FileProtocolHandler "file:///x:/temp/fragtest.htm#frag"

注意引号!!!

rundll32 URL.dll, FileProtocolHandler file:///x:/temp/fragtest.htm#frag 来达到预期效果。


0

仅适用于Windows,您可以尝试

System.exec("cmd.exe start file:///C:/foo/bar.html#anchor")

0
你可以尝试使用BrowserLauncher2。它是一个小巧且自包含的跨平台库,可打开默认浏览器。它能完美处理锚点。

在Windows 7中对我不起作用,锚点被剥离了。我认为这是一个操作系统问题,ProcessMonitor显示我的调用Firefox没有锚点。 - glenneroo
虽然这可能是解决问题的有价值的提示,但一个好的答案也应该展示解决方案。请编辑以提供示例代码以说明您的意思。或者,考虑将其编写为评论。 - Toby Speight

0

我对这个项目进行了一些调查 - 请注意,打开cmd并键入start file:///c:/temp/test.html#anchor也不起作用。

我认为唯一有效的方法是手动调用浏览器(或使用第三方工具来完成此操作)。

在Windows上,您始终可以使用Internet Explorer,因此如果您真的不想自己找到iexplore.exe,则可以调用Runtime.getRuntime().exec("cmd.exe start iexplore " + myURL) - 但这也并不总是有效。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接