Другой способ сделать это (из Как запустить URL протокола файла с привязкой из Java? ):
Runtime.getRuntime().exec("cmd.exe start file:///C:/foo/bar.html#anchor")
Обновление:
Еще одна ссылка с этой проблемой (с использованием url.dll) показывает, что автор возвращается к попытке внешней программы, в данном случае Quero : Runtime.getRuntime().exec("cmd.exe qlaunch.exe open=\"file:///c:/temp/test.html?p=1\"");
Из того, что я могу сказать, это ошибка в Windows и / или Internet Explorer, в частности. Firefox имеет другие проблемы с протоколом file://
, которые необходимо отключить вручную.
Обновление 2:
Это определенно ожидаемое поведение или ошибка в самой Windows. Использование Desktop.browse
(, которое отправляет чистый URI в ShellExecute ) или cmd.exe start
или Runtime.getRuntime().exec("rundll32 url.dll " + uri)
, или даже просто открытие командной строки и ввод самого URI file://
просто заканчивают тем, что я делаю (что я найдено через Process Monitor):

Показан порядок операций:
- (1-й блок) Thread Create = когда я нажимаю enter в окне cmd выше
- Найдите файл, пройдя по дереву каталогов (например, перейдите в c:, войдите в temp)
- (2-я ячейка) Когда этот файл найден, выполняется ОСТАНОВКА (что означает, что Windows проанализировала символы
#
и ?
)
- (3-й блок) DONE look (CloseFile в родительской папке, после которого больше нет дискового ввода-вывода)
- (4-е поле) Теперь, когда файл найден, посмотрите, какие файлы .htm открываются (например, в вашем браузере)
- Как ни странно, позже он находит Chrome (браузер по умолчанию), но запускает IE (?!) И , затем запускает Chrome - это может быть большой частью проблемы.
Обратите внимание, что вызов start iexplore file:///c:/temp/test.html#mark
работает , потому что он просто передает параметр, не пытаясь сделать что-то особенное.
Обратите внимание, что шаги 2 и 3 нарушают собственные рекомендации Microsoft от 2006 года ( см. Здесь ), но из того, что я видел, это поведение было введено во время выхода IE7. Я предполагаю, что это исправило некоторую ошибку или уязвимость в Windows за счет возможности сделать это вообще.
После еще одного исследования выяснилось, что file:
URI в Windows имели очень sordid прошлых
Как ни странно, в статье Microsoft за 2010 год показано file://host/path/file.txt?Query#fragment
в качестве действительного URI в .Net ...
Я думаю, что вам может не повезти, пока кто-то не найдет магический параметр реестра - или вы можете вручную вызвать браузер (например, 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)