我试图从命令行运行Matlab脚本,而我又从Java调用了该脚本。我使用循环多次调用该脚本,并且在每次迭代中都希望我的Java程序暂停直到Matlab脚本结束并且退出Matlab。
使用this example(效果很好)作为模板,我想出了以下代码(简化了): 编辑:增加了输入流和错误流的消耗
Runtime rt = Runtime.getRuntime();
String cmd = "matlab -r \"my_matlab_cmd(arg1, arg2); exit\"";
try {
Process proc = rt.exec(cmd);
BufferedReader stdInput = new BufferedReader(new InputStreamReader(proc.getInputStream()));
String line = null;
while((line = stdInput.readLine()) != null) {
System.out.println(line);
}
BufferedReader stdError = new BufferedReader(new InputStreamReader(proc.getErrorStream()));
StringBuilder err = new StringBuilder();
String e = null;
while ((e = stdError.readLine()) != null) {
err.append(e + "\n");
}
if (err.length() != 0) {
throw new IOException(err.toString());
}
int pwf = proc.waitFor();
System.out.println(pwf);
} catch (IOException e1) {
e1.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Matlab finished");
但是,这并不符合预期。 Java不等待Matlab做事然后关闭。而是直接转到最终的打印输出命令。没有错误,并且pwf
的值是0,符合预期。
我在这里想念什么?
更新:我刚刚发现,如果我将toy example中的notepad.exe
替换为matlab.exe
,它将不再起作用-Java甚至在打开Matlab之前就终止了。
答案 0 :(得分:2)
Matlab还需要-wait参数以不立即返回: https://www.mathworks.com/matlabcentral/answers/320908-how-to-start-matlab-from-command-prompt-and-wait-for-the-application-to-return
据我了解,matlab启动脚本时可以将其作为子流程传递,因此,除非另有说明,否则主matlab命令在启动子流程后立即终止
另请参阅:https://www.mathworks.com/help/matlab/ref/matlabwindows.html 没有启动画面和其他选项