我希望使用计算机上安装的相关程序(在此示例中,使用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()方法,以便返回正确的可执行文件吗?还是有另一种方法可以做到这一点吗?
答案 0 :(得分:2)
使用相关程序打开文件的正确平台独立方式是Desktop.open()
。不幸的是,它没有提供与最终过程进行交互的任何方式。
如果您愿意失去平台独立性,可以使用start
中的cmd.exe
命令:
String fileName = "c:\\tmp\\test.doc";
String[] commands = {"cmd", "/c", "start", "\"Title\"",fileName};
Process p = Runtime.getRuntime().exec(commands);
p.waitFor()
答案 1 :(得分:0)
没有纯Java方法可以做到这一点,因为它必然是特定于操作系统的。在Windows平台上,the start
command可能就是您要查找的内容(例如start myfile.txt
)。
答案 2 :(得分:0)
在所有平台上都没有“通用”的方法。在Windows上,您可以执行“start”,它将找到正确的关联可执行文件。在Mac上,您可以执行“打开”。在Linux上,据我所知,我担心你必须手动映射首选应用程序。
String execName = ("cmd /c \"start " + filename + "\"");
答案 3 :(得分:0)
您可以尝试使用Windows注册表和其他特定于平台的设置,但我认为最好的解决方案是让应用程序有自己的首选项设置。
您可能希望使用package java.util.prefs
中的类来实现此目的。
答案 4 :(得分:0)
我已经弄清楚了。
使用cmd.exe + start.exe组合,waitFor()方法不会等待子进程结束。
如果在没有启动选项的情况下执行此操作,它就像魅力(仅限Windows):
Process p = Runtime.getRuntime().exec("cmd /c \"" + filename + "\""); //extra quotes for filenames with spaces
p.waitFor()