对于我的应用程序,我使用SUMO(模拟某条路线上的流量的应用程序)。
当使用正确的参数启动此程序时,它将生成输出。但必须从命令行开始此模拟。 所以我想用procesBuilder来解决这个问题,但这不起作用。我发现很多人在使用这个procesBuilder时遇到了问题,但在阅读了如何用它执行我的命令行之后我却不明白。
需要执行的命令是:
"sumo -c \"" + path + FILENAME_CONFIG + "\" --netstate-dump " + ouputPath"
Sumo位于我的桌面
"C:\Users\Samee\Desktop\SUMO\sumo-0.17.0\bin"
现在我通过将上述信息放在bat文件中并运行bat文件来解决这个问题。 (在使用Cd导航时设置路径。 我如何运行bat文件:
Process rt = Runtime.getRuntime().exec("cmd /c start " + generator.getPath() + Generator.FILENAME_BAT);
但我需要知道模拟何时停止模拟。
这可以通过procesBuilder
来解决吗?
像:
ProcessBuilder builder = new ProcessBuilder("sumo -c \"" + path + FILENAME_CONFIG + "\" --netstate-dump " + ouputPath);
我怎么知道ProcessBuilder是否完成了执行?
答案 0 :(得分:0)
ProcessBuilder
期望每个参数作为单独的String
ProcessBuilder builder = new ProcessBuilder(
"sumo.exe",
"-c",
path + FILENAME_CONFIG + "\",
"--netstate-dump",
ouputPath);
<强>更新强>
命令名称应为sumo.exe
。除非sumo.exe
在操作系统的搜索路径中,否则操作系统将无法运行它。
相反,您需要提供绝对路径C:\\Users\\Samee\\Desktop\\SUMO\\sumo-0.17.0\\bin\\sumo.exe
答案 1 :(得分:0)
使用以下代码为您的流程提供命令行参数。提供Sting列表,Process Builder能够解析来自提供列表的参数
final List<String> commands = new ArrayList<String>();
commands.add("sumo");//commands.add("C:\Users\Samee\Desktop\SUMO\sumo-0.17.0\bin\sumo");
commands.add(" -c ");
commands.add(path);
commands.add(FILENAME_CONFIG);
commands.add("--netstate-dump");
commands.add(ouputPath);
ProcessBuilder pb = new ProcessBuilder(commands);
答案 2 :(得分:0)
要检查外部流程是否已完成(以及捕获输出/退出值),您可以执行以下操作:
static public String runCmd(String... commands)
{
final int BUFSIZE = 1024;
StringBuilder sb = new StringBuilder(BUFSIZE);
int exitVal = -1;
ProcessBuilder builder = new ProcessBuilder(commands);
builder.redirectErrorStream(true);
try
{
Process p = builder.start();
InputStream in = p.getInputStream();
InputStreamReader isr = new InputStreamReader(in);
char[] buf = new char[BUFSIZE];
int len = -1;
while (-1 != (len = isr.read(buf)))
{
sb.append(buf, 0, len);
}
exitVal = p.waitFor();
p.destroy();
} catch (IOException e)
{
e.printStackTrace();
} catch (InterruptedException e)
{
e.printStackTrace();
}
return sb.toString();
}