1

对于我的应用程序,我使用 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 是否执行完毕?

4

3 回答 3

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();
}
于 2013-05-25T17:43:07.797 回答
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);
于 2013-05-25T13:26:53.767 回答
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

于 2013-05-25T13:06:40.353 回答