2010-06-07 1 views
2

Я хочу открыть файл (скажем, текстовый документ) из приложения Java, используя соответствующую программу, установленную на компьютере (в этом примере, используя MS Word или Open Office Writer).Найти связанную программу, чтобы открыть файл с помощью Java

Уловка заключается в том, что я хочу подождать, пока этот подпроцесс не завершится, что можно сделать с помощью метода waitFor() в классе Process.

String executable = findAssociatedApplicationPath(); //for example, returns "C:\\Program Files\\Microsoft Office\\Office12\\msword.exe" 
Process p = Runtime.getRuntime().exec(executable + " " + filepath); 
p.waitFor(); 

Может кто-нибудь сказать мне, как написать метод findAssociatedApplicationPath(), чтобы он возвращает правильный исполняемый файл? Или есть другой способ сделать это?

ответ

2

Правильный независимый от платформы способ открыть файл с помощью соответствующей программы - Desktop.open(). К сожалению, он не предлагает никакого способа взаимодействия с полученным процессом.

Если вы готовы потерять платформы Independance, вы можете использовать команду start в cmd.exe:

String fileName = "c:\\tmp\\test.doc"; 
String[] commands = {"cmd", "/c", "start", "\"Title\"",fileName}; 
Process p = Runtime.getRuntime().exec(commands); 
p.waitFor() 
0

Там нет чисто Java способ сделать это, потому что это обязательно OS-специфичны. На платформе Windows the start command - это, вероятно, то, что вы ищете (например, start myfile.txt).

0

Существует не «универсальный» способ сделать это на всех платформах. В Windows вы можете выполнить «start», который найдет правильный связанный с ним исполняемый файл. На маке вы можете выполнить «open». Насколько я знаю, в Linux я боюсь, что вам придется вручную отображать предпочтительные приложения.

String execName = ("cmd /c \"start " + filename + "\""); 
+0

Linux имеет как платформы в зависимости от решений, как Windows, за исключением того, они различаются в зависимости от установки к установке. Например, у Гнома есть гном-открытый. –

0

Вы можете попробовать возиться с реестром Windows, и другими настройками для конкретных платформ, но я думаю, что лучшее решение будет просто применение имеет свои собственные настройки предпочтений.

Для этого вы можете использовать классы в package java.util.prefs.

0

Я понял это.

Используя комманду cmd.exe + start.exe, метод waitFor() не будет ждать завершения подпроцесса.

Если делать это без опции запуска, это работает как шарм (окна только хотя):

Process p = Runtime.getRuntime().exec("cmd /c \"" + filename + "\""); //extra quotes for filenames with spaces 
p.waitFor() 
Смежные вопросы