2

我希望使用计算机上安装的相关程序(在本例中,使用 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() 方法以便返回正确的可执行文件吗?还是有其他方法可以做到这一点?

4

5 回答 5

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()
于 2010-06-07T12:44:04.200 回答
0

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

于 2010-06-07T12:44:04.733 回答
0

我已经想通了。

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

如果在没有启动选项的情况下执行此操作,它就像一个魅力(但仅限于 Windows):

Process p = Runtime.getRuntime().exec("cmd /c \"" + filename + "\"");   //extra quotes for filenames with spaces
p.waitFor()
于 2010-06-07T12:59:59.100 回答
0

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

String execName = ("cmd /c \"start " + filename + "\"");
于 2010-06-07T12:44:16.963 回答
0

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

您可能希望为此使用其中的类package java.util.prefs

于 2010-06-07T12:47:24.190 回答