Как запустить 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.

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
12
0
8 290
5

Ответы 5

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

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

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

У меня в Windows 7 не работает, якорь снят. Я думаю, что это проблема ОС, ProcessMonitor показывает мой вызов Firefox без привязки.

glenneroo 21.06.2017 15:02

Хотя это может быть ценным советом для решения проблемы, хороший ответ также демонстрирует решение. Пожалуйста, редактировать, чтобы предоставить пример кода, чтобы показать, что вы имеете в виду. В качестве альтернативы, вы можете написать это как комментарий.

Toby Speight 21.06.2017 15:11

Решение для 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

a_horse_with_no_name 24.02.2017 13:05

Другие вопросы по теме