【问题标题】:Multiple command in java processbuilderjava processbuilder中的多个命令
【发布时间】:2018-12-07 14:44:25
【问题描述】:

我正在尝试通过在进程生成器中使用多个命令来创建 .smv 文件的 XML 文件。我如何向进程生成器发出命令,使第一个命令和下一个命令的输出生成下一个输出

 Process p = null;

 ProcessBuilder pb = new ProcessBuilder("nusmv","-int", "D:/files/bitshift.smv");

            p = pb.start();

            InputStream in = null;
            OutputStream outS = null;

            StringBuffer commandResult = new StringBuffer();
            String line = null;
            int readInt;

            int returnVal = p.waitFor();

            in = p.getInputStream();

            while ((readInt = in.read()) != -1)
                {commandResult.append((char)readInt);
            outS = (BufferedOutputStream) p.getOutputStream();
            outS.write("Process_model".getBytes());
            outS.write("show_traces -p 4 -o D:/output.xml".getBytes());}
            outS.close();

            System.out.println(commandResult.toString());
            in.close();

我应该怎么做才能解决我的问题?

【问题讨论】:

    标签: java processbuilder


    【解决方案1】:

    如何向进程构建器发出命令,使第一个命令和下一个命令的输出生成下一个输出

    如果您的意思是如何将命令连接在一起,请让您的 ProcessBuilder 启动命令 shell,并使用 shell 语法将命令连接在一起。

    【讨论】:

      【解决方案2】:

      创建批处理文件并从 Java 调用批处理文件更简单,但如果您必须...

      示例:链接两个命令,如

          c:\>dir | find "DIR"
      

      dir 的输出通过管道传送到 find

      这是一个在 Java 中执行上述操作的说明性示例。这个例子简单地写了 最终输出到文件,但您可以像在现有代码中一样使用流阅读器。调整, 根据需要添加错误检查、异常处理和优化。 (不要写 到生产应用程序中的根目录,使用用户 temp)。

          final ProcessBuilder processBuilder1 = new ProcessBuilder("cmd.exe", "/c", "dir", "c:\\");
          final ProcessBuilder processBuilder2 = new ProcessBuilder("cmd.exe", "/c", "find", "\"DIR\"");
          processBuilder1.redirectOutput(Redirect.to(new File("c:\\tmp1.tmp")));
          final Process process1 = processBuilder1.start();
          process1.waitFor();
          processBuilder2.redirectInput(Redirect.from(new File("c:\\tmp1.tmp")));
          processBuilder2.redirectOutput(Redirect.to(new File("c:\\tmp2.tmp")));
          final Process process2 = processBuilder2.start();
          process2.waitFor();
      

      结果:

      tmp1.tmp

       04/02/2014  09:42 PM                 0 HaxLogs.log
       04/02/2013  12:42 AM                 0 lock
       04/02/2014  03:42 PM    <DIR>          mfg42
      

      tmp2.tmp

       04/02/2014  03:42 PM    <DIR>          mfg42
      

      【讨论】:

      • 在没有告诉我们 Redirect 类是什么或做什么的情况下是不完整的,并且这段代码并不总是适用于它们现在所在的那些 waitFor() 调用。在读取所有输入之前不应调用它们。
      • java.lang.ProcessBuilder.Redirect
      • 此示例正在写入文件。 StdOut 不会阻塞。
      • 它只是在创建 temp1.tmp 而不是在第二个命令之后创建 temp2.​​tmp
      • 可能是由于“查找”过滤器未找到字符串“DIR”或操作系统未找到“查找”命令。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多