Как запустить URL-адрес файла протокола с якорем из Java?

Из программы 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.

Ответ 1

Я просто решил это другим способом, потому что никакое количество цитат или пробелов в любом из этих примеров не работало для меня.

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 Выполните команду local rundll с помощью нового временного URI:

Runtime.getRuntime().exec(
  "rundll32 url.dll,FileProtocolHandler \"" 
  +tmpfile.toURI().toString()+ "\"");

Надеюсь, это сработает для вас!

Ответ 2

Только для Windows вы можете попробовать

System.exec("cmd.exe start file:///C:/foo/bar.html#anchor")

Ответ 3

Решение для Windows:

rundll32 URL.dll, FileProtocolHandler "файл:///x:/temp/fragtest.htm#frag"

Обратите внимание на цитаты!!!

rundll32 URL.dll, файл FileProtocolHandler:///x:/temp/fragtest.htm#frag работает должным образом.

Ответ 4

Вы можете попробовать использовать BrowserLauncher2. Это небольшая и автономная кросс-платформенная библиотека для открытия браузера по умолчанию. Он отлично справляется с якорями.

Ответ 5

Я провел некоторое исследование этого элемента здесь - обратите внимание, что открытие cmd и ввод start file:///c:/temp/test.html#anchor также не работает.

Я думаю, что единственное, что на самом деле работает, - это вызвать браузер вручную (или использовать сторонний инструмент, который это делает).

В Windows у вас всегда есть Internet Explorer, поэтому вы можете вызвать Runtime.getRuntime().exec("cmd.exe start iexplore " + myURL), если вы действительно не хотите искать iexplore.exe самостоятельно, но это не всегда работает.