我使用Java中的以下代码启动URL:
Runtime.getRuntime().exec("rundll32 url.dll, FileProtocolHandler " + myURL)
此处myURL为“ file:/// C:/Desktop/test.html#bottom ”
当我传递这样的网址时,它只执行“ file:/// C:/Desktop/test.html ”
不包括 #bottom 。
如何在Java中正确启动此URL?
答案 0 :(得分:3)
另一种方法(来自How to launch a file protocol URL with an anchor from Java?):
Runtime.getRuntime().exec("cmd.exe start file:///C:/foo/bar.html#anchor")
Yet another link with this issue(使用url.dll)显示作者恢复尝试外部程序,在这种情况下Quero:Runtime.getRuntime().exec("cmd.exe qlaunch.exe open=\"file:///c:/temp/test.html?p=1\"");
据我所知,这是Windows和/或Internet Explorer中的一个错误。 Firefox has other issues使用file://
协议,您必须手动禁用。
这绝对是预期的行为或Windows本身的错误。使用Desktop.browse
(which sends the URI clean to ShellExecute)或cmd.exe start
或Runtime.getRuntime().exec("rundll32 url.dll " + uri)
或者甚至只是打开命令提示符并输入file://
URI本身就最终会这样做(我通过Process Monitor找到):
显示的操作顺序:
#
和?
个字符)请注意,调用start iexplore file:///c:/temp/test.html#mark
可以正常工作,因为它只是传递参数而不尝试做任何特殊操作。
请注意,步骤2和3违反了微软自己2006年的建议(see here),但从我看到的这个行为是在IE7发布时引入的。我的猜测是,它修复了Windows中的一些错误或安全漏洞,但代价是能够执行此操作。
通过更多研究,Windows中的file:
URI似乎有very sordid past
奇怪的是,Microsoft article from 2010将file://host/path/file.txt?Query#fragment
显示为.Net中的有效URI ...
我认为在有人找到神奇的注册表设置之前你可能会失败 - 或者你可以手动调用浏览器(例如Runtime.getRuntime().exec(chromepath + "chrome.exe file:///c:/temp/test.html#jump")
或Runtime.getRuntime().exec(iepath + "iexplore.exe file:///c:/temp/test.html#jump")
)
或者,为了好玩:Runtime.getRuntime().exec("cmd.exe start iexplore " + myURL)
答案 1 :(得分:0)
使用Desktop.browse(URI)
(有可能使用* nix和OS X以及Windows)。
好的 - 抓住那个。基于网络的URI将滚动到锚点,基于磁盘的URI将不会。使用Oracle提出了一个错误报告(ID:7143677 - Desktop.browse()
- 本地URI忽略了锚点。)