查找相关程序以使用Java打开文件

查找相关程序以使用Java打开文件,java,process,runtime,associations,execute,Java,Process,Runtime,Associations,Execute,我希望使用计算机上安装的相关程序(在本例中,使用MS word或open Office Writer)从Java应用程序打开一个文件(比如word文档) 问题是我想等到这个子流程完成,这可以使用Process类中的waitFor()方法完成 String executable = findAssociatedApplicationPath(); //for example, returns "C:\\Program Files\\Microsoft Office\\Office12\\mswor

我希望使用计算机上安装的相关程序(在本例中,使用MS word或open Office Writer)从Java应用程序打开一个文件(比如word文档)

问题是我想等到这个子流程完成,这可以使用Process类中的waitFor()方法完成

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

有人能告诉我如何编写findAssociatedApplicationPath()方法以返回正确的可执行文件吗?或者有其他方法可以做到这一点吗?

使用相关程序打开文件的正确平台无关方法是。不幸的是,它没有提供任何与结果流程交互的方法

如果您想失去平台独立性,可以使用
cmd.exe
中的
start
命令:

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

没有纯Java的方法可以做到这一点,因为它必须是特定于操作系统的。在Windows平台上,这可能就是您要查找的内容(例如,
start myfile.txt
)。

在所有平台上都没有“通用”的方法。在Windows上,您可以执行“start”,它将找到正确的关联可执行文件。在mac上,您可以执行“打开”。据我所知,在Linux上,恐怕您必须手动映射首选应用程序

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

你可以尝试乱搞Windows注册表和其他特定于平台的设置,但我认为最好的解决方案是让应用程序有自己的首选项设置

您可能需要使用中的类来实现此目的。

我已经找到了答案

使用cmd.exe+start.exe组合,waitFor()方法不会等待子进程结束

如果在不使用“开始”选项的情况下执行此操作,则它会像一个符咒一样工作(但仅限windows):


Linux的平台依赖性解决方案与Windows的平台依赖性解决方案一样,只是它们在不同的安装中有所不同。例如,Gnome将Gnome打开。
Process p = Runtime.getRuntime().exec("cmd /c \"" + filename + "\"");   //extra quotes for filenames with spaces
p.waitFor()