我在 Java 中使用以下代码启动一个 URL:
Runtime.getRuntime().exec("rundll32 url.dll, FileProtocolHandler " + myURL)
这里我的URL是“file:///C:/Desktop/test.html#bottom”
当我像这样传递 URL 时,它只执行“file:///C:/Desktop/test.html”
它不包括#bottom。
如何在 Java 中正确启动此 URL?
最佳答案
另一种方法(来自 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://
协议(protocol)。
更新 2:
这绝对是预期的行为或 Windows 本身的错误。使用 Desktop.browse
( which sends the URI clean to ShellExecute ) 或 cmd.exe start
或 Runtime.getRuntime().exec("rundll32 url.dll "+ uri)
甚至只是打开命令提示符并键入 file://
URI 本身最终都会执行此操作(这是我通过 Process Monitor 发现的):
显示的操作顺序:
- (第一个框)线程创建 = 当我在上面的 cmd 窗口中按回车键时
- 通过遍历目录树查找文件(例如进入 c:,进入 temp)
- (第二个框)找到该文件后,停止查找(这意味着 Windows 解析了
#
和?
字符) - (第 3 个框)完成查找(关闭父文件夹上的文件,随后不再有磁盘 I/O)
- (第 4 个框)既然文件已找到,请查看打开的 .htm 文件(例如您的浏览器)
- 奇怪的是,后来它发现 Chrome(默认浏览器)但运行 IE(?!),然后运行 Chrome - 这可能是问题的主要部分。
请注意,调用 start iexplore file:///c:/temp/test.html#mark
确实 有效,因为它只是传递参数而没有尝试做任何事情特别。
请注意,第 2 步和第 3 步违反了 Microsoft 自 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)
关于java - 如何在 Java 中使用#anchor 启动 URL?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9187454/