如何在Java中使用#anchor启动URL?
我在Java中使用以下代码启动URL:
Runtime.getRuntime().exec("rundll32 url.dll, FileProtocolHandler " + myURL)
这里myURL是“ file:/// C:/Desktop/test.html#bottom ”
当我像这样传递URL时,它只执行“ file:/// C:/Desktop/test.html ”
它不包括#bottom 。
如何在Java中正确启动此URL?
另一种方法(从如何使用Java的锚启动文件协议URL? ):
Runtime.getRuntime().exec("cmd.exe start file:///C:/foo/bar.html#anchor")
更新:
此问题的另一个链接 (使用url.dll)显示作者恢复尝试外部程序,在本例中为Quero : Runtime.getRuntime().exec("cmd.exe qlaunch.exe open=\"file:///c:/temp/test.html?p=1\"");
据我所知,这是Windows和/或Internet Explorer中的一个错误。 Firefox还有 file://
协议的其他问题 ,你必须手动禁用它。
更新2:
这绝对是预期的行为或Windows本身的错误。 使用Desktop.browse
( 将URI清除发送到ShellExecute )或cmd.exe start
或Runtime.getRuntime().exec("rundll32 url.dll " + uri)
,甚至只需打开命令提示符并键入file://
URI本身最终会这样做(我通过Process Monitor找到):
显示的操作顺序:
- (第1个方框)Thread Create =当我在上面的cmd窗口中按Enter键
- 遍历目录树查找文件(例如进入c:,进入temp)
- (第二个方框)找到该文件后,停止查找(这意味着Windows解析了
#
和?
字符) - (第3个方框)完成查找(父文件夹上的CloseFile,后面没有更多的磁盘I / O)
- (第4个方框)现在找到了文件,看看打开了什么.htm文件(例如你的浏览器)
- 奇怪的是,稍后它会找到Chrome(默认浏览器)但运行IE(?!) 然后运行Chrome – 这可能是问题的一个重要部分。
请注意,调用start iexplore file:///c:/temp/test.html#mark
确实有效,因为它只是传递参数而不尝试做任何特殊操作。
请注意,步骤2和3违反了微软自己2006年的建议( 参见此处 ),但从我看到的这一行为是在IE7发布时引入的。 我的猜测是,这解决了Windows中的一些错误或安全漏洞,其代价是能够完成此操作。
通过一些更多的研究,似乎file:
Windows中的URI已经过去 非常 肮脏了
奇怪的是, 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(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)
使用Desktop.browse(URI)
(有可能在* nix和OS X以及Windows上工作)。
更新:
好的 – 抓一点。 基于网络的URI将滚动到锚点,基于磁盘的URI将不会。 提出了Oracle的错误报告(ID: 7143677 – Desktop.browse()
– 本地URI忽略了锚点 )。