Как открыть предпочтительный редактор системы для данного файла? - PullRequest
12 голосов
/ 08 февраля 2009

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

Скажем, у нас есть файловый менеджер, написанный на 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). Вы знаете?

Ответы [ 4 ]

7 голосов
/ 08 февраля 2009

Проверьте объект 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;
}
7 голосов
/ 08 февраля 2009

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

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

Linux:

edit <file.ext>

Mac:

open <file.ext>

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

2 голосов
/ 08 февраля 2009

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

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

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

1 голос
/ 27 октября 2015

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

Runtime.getRuntime().exec( "CMD /C START filename.ext " );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...