如何在Java中使用#anchor启动URL?

时间:2012-02-08 03:24:22

标签: java url

我使用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?

2 个答案:

答案 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)显示作者恢复尝试外部程序,在这种情况下QueroRuntime.getRuntime().exec("cmd.exe qlaunch.exe open=\"file:///c:/temp/test.html?p=1\"");

据我所知,这是Windows和/或Internet Explorer中的一个错误。 Firefox has other issues使用file://协议,您必须手动禁用。


更新2:

这绝对是预期的行为或Windows本身的错误。使用Desktop.browsewhich sends the URI clean to ShellExecute)或cmd.exe startRuntime.getRuntime().exec("rundll32 url.dll " + uri)或者甚至只是打开命令提示符并输入file:// URI本身就最终会这样做(我通过Process Monitor找到):

Process Monitor screenshot

显示的操作顺序:

  1. (第1个方框)Thread Create =当我在上面的cmd窗口中按Enter键时
  2. 通过遍历目录树查找文件(例如进入c:,进入临时文件)
  3. (第二个方框)找到该文件后,停止查找(这意味着Windows解析了#?个字符)
  4. (第3个方框)完成查找(父文件夹上的CloseFile,后面没有磁盘I / O)
  5. (第4个方框)现在找到了文件,查看打开了哪些.htm文件(例如您的浏览器)
  6. 奇怪的是,稍后它会找到Chrome(默认浏览器)但运行IE(?!)和然后运行Chrome - 这可能是问题的一个重要部分。
  7. 请注意,调用start iexplore file:///c:/temp/test.html#mark 可以正常工作,因为它只是传递参数而不尝试做任何特殊操作。

    请注意,步骤2和3违反了微软自己2006年的建议(see here),但从我看到的这个行为是在IE7发布时引入的。我的猜测是,它修复了Windows中的一些错误或安全漏洞,但代价是能够执行此操作。

    通过更多研究,Windows中的file: URI似乎有very sordid past

    奇怪的是,Microsoft article from 2010file://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忽略了锚点。)