Как открыть предпочтительный редактор системы пользователей для данного файла?

Я пытаюсь выяснить, как открыть системный предпочтительный редактор для данного файла.

Скажем, у нас есть файловый менеджер, написанный на Java. Пользователь переходит в папку и видит список файлов. И, например, есть файл Icon.jpg. Пользователь дважды нажимает на имя файла и файл открывается в системном предпочтительном редакторе (т.е. Gimp). Основная проблема - как это сделать?

Мы можем сделать Runtime.getRuntime().exec("something file"), но таким образом вы должны знать, какая программа предпочтительна в пользовательской среде. Но как?

Мы также можем сделать Desktop.getDesktop().edit(File file), но таким образом мы не можем отслеживать процесс и не можем знать, что этот дочерний процесс закрыт. Другая проблема - функция не работает на linux (по крайней мере, на Ubuntu 8.10). Существует также Desktop.getDesktop().open(File file), но он заставляет открыть просмотрщик файлов, а не системный просмотрщик для этого типа файла.

Я ищу решение на всю неделю, но не получил подходящего и общего. Знаете ли вы другие подходы к этому вопросу? Для моего проекта было бы достаточно, если бы он работал на Windows + Linux + Mac.

Спасибо за ваши ответы и советы.

Редактировать 2009-02-08 23:04

Другое предложение: могу ли я заставить окно выбора приложения в Windows и Linux, как в Mac с "открытым файлом"? Например, тогда вы пытаетесь открыть файл, вас попросят выбрать приложение из списка предпочтительных систем? (что-то вроде "Открыть с..." в проводнике Windows). Знаете ли вы?

Ответ 1

Кажется, что если вы не можете использовать java.awt.Desktop, вам нужно различать ОС: Окна:

RUNDLL32.EXE SHELL32.DLL,OpenAs_RunDLL <file.ext>

Linux:

edit <file.ext>

Mac:

open <file.ext>

НТН. Очевидно, что это не очень портативно...

Ответ 2

Проверьте объект java.awt.Desktop. В вашем случае вы хотите вызвать edit()

Если вы хотите, чтобы данная платформа поддерживала этот вызов, вы можете сделать что-то вроде следующего (я не тестировал этот код):

public boolean editFile(final File file) {
  if (!Desktop.isDesktopSupported()) {
    return false;
  }

  Desktop desktop = Desktop.getDesktop();
  if (!desktop.isSupported(Desktop.Action.EDIT)) {
    return false;
  }

  try {
    desktop.edit(file);
  } catch (IOException e) {
    // Log an error
    return false;
  }

  return true;
}

Ответ 3

Это не кросс-платформенный, но в Mac OS X вы можете сделать

Runtime.getRuntime().exec("open filename");

Исполняемый open(1) использует LaunchServices, чтобы выбрать нужную программу для выполнения, а затем использует ее для открытия файла с именем filename.

Ответ 4

Это будет работать в windows

Runtime.getRuntime().exec( "CMD /C START filename.ext " );