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


person Jeff C    schedule 18.11.2008    source источник


Ответы (5)


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

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()+ "\"");

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

person memnoch_proxy    schedule 07.11.2012
comment
Это также работает с Desktop.browse() - по крайней мере, в Windows - person a_horse_with_no_name; 24.02.2017

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

rundll32 URL.dll, FileProtocolHandler "file:///x:/temp/fragtest.htm#frag"

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

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

person Helmut Reis    schedule 12.11.2010

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

System.exec("cmd.exe start file:///C:/foo/bar.html#anchor")
person Lawrence Dol    schedule 27.11.2008

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

person amarillion    schedule 12.06.2009
comment
У меня не работает в Windows 7, привязка снята. Я думаю, что это проблема ОС, ProcessMonitor показывает мой вызов Firefox без привязки. - person glenneroo; 21.06.2017
comment
Хотя это может быть ценным советом для решения проблемы, хороший ответ также демонстрирует решение. Пожалуйста, отредактируйте, чтобы предоставить пример кода, чтобы показать, что вы имеете в виду. В качестве альтернативы, рассмотрите возможность написания этого в качестве комментария. - person Toby Speight; 21.06.2017

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

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

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

person Adam Rofer    schedule 08.02.2012