Из программы Java мне нужно запустить браузер по умолчанию в локальном HTML-файле, указав привязку внутри файла. В Java SE 6 метод java.awt.Desktop.browse откроет файл, но не будет учитывать привязку, поэтому что-то вроде следующего открывает файл вверху, но не перенаправляет браузер на привязку:
Desktop.getDesktop("file:///C:/foo/bar.html#anchor");
Sun сообщает здесь http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6477862, что привязки не поддерживаются в протоколе URI файла.
Есть ли у кого-нибудь лучший ответ?
Я могу использовать Java SE 6. Я был бы в порядке с решением только для Windows.




Только для Windows вы можете попробовать
System.exec("cmd.exe start file:///C:/foo/bar.html#anchor")
Вы можете попробовать использовать BrowserLauncher2. Это небольшая и автономная кроссплатформенная библиотека для открытия браузера по умолчанию. Он отлично справляется с якорями.
Хотя это может быть ценным советом для решения проблемы, хороший ответ также демонстрирует решение. Пожалуйста, редактировать, чтобы предоставить пример кода, чтобы показать, что вы имеете в виду. В качестве альтернативы, вы можете написать это как комментарий.
Решение для Windows:
rundll32 URL.dll, FileProtocolHandler "file: /// x: /temp/fragtest.htm#frag"
Обратите внимание на цитаты !!!
rundll32 URL.dll, FileProtocolHandler file: /// x: /temp/fragtest.htm#frag работает должным образом.
Я провел небольшое расследование по этому пункту здесь - обратите внимание, что открытие cmd и ввод start file:///c:/temp/test.html#anchor также не работают.
Я думаю, что единственное, что действительно работает, - это вызвать браузер вручную (или использовать сторонний инструмент, который делает это).
В Windows у вас всегда есть Internet Explorer, поэтому вы можете вызвать в Runtime.getRuntime().exec("cmd.exe start iexplore " + myURL), если действительно не хотите самостоятельно находить iexplore.exe - но это также не всегда работает.
Я просто решил это по-другому, потому что никакое количество цитат или пробелов в любом из этих примеров не помогло мне.
1 Определите, имеет ли URI файла привязку или строку запроса
2 Если да, создайте временный файл File tmpfile = File.createTempFile("apphelp", ".html") с мета-перенаправлением на фактический URI файла, который мне нужен:
<html><head>
<meta http-equiv = "refresh" content = "0;url=help.html#set_filter" />
</head></html>
3 Выполните локальную команду rundll, используя новый временный URI:
Runtime.getRuntime().exec(
"rundll32 url.dll,FileProtocolHandler \""
+tmpfile.toURI().toString()+ "\"");
Надеюсь, это сработает для вас!
Это также работает с Desktop.browse() - по крайней мере, в Windows
У меня в Windows 7 не работает, якорь снят. Я думаю, что это проблема ОС, ProcessMonitor показывает мой вызов Firefox без привязки.