如何在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 startRuntime.getRuntime().exec("rundll32 url.dll " + uri) ,甚至只需打开命令提示符并键入file:// URI本身最终会这样做(我通过Process Monitor找到):

Process Monitor截图

显示的操作顺序:

  1. (第1个方框)Thread Create =当我在上面的cmd窗口中按Enter键
  2. 遍历目录树查找文件(例如进入c:,进入temp)
  3. (第二个方框)找到该文件后,停止查找(这意味着Windows解析了#?字符)
  4. (第3个方框)完成查找(父文件夹上的CloseFile,后面没有更多的磁盘I / O)
  5. (第4个方框)现在找到了文件,看看打开了什么.htm文件(例如你的浏览器)
  6. 奇怪的是,稍后它会找到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忽略了锚点 )。