【问题标题】:Command in Runtime.getRuntime().exec not working [duplicate]Runtime.getRuntime().exec 中的命令不起作用[重复]
【发布时间】:2014-03-21 10:41:37
【问题描述】:

我有一个名为MemoryComparison.java 的java 文件保存在D:\Documents\CodeAnalysis\project_analysis_RG\CodeAnalysis\input\master\Kajari_G 文件夹中

我有另一个文件夹D:\Documents\CodeAnalysis\output\,我想在其中存储上述java文件执行后的输出。

在 Java 程序 MemoryComparison.java 中我没有给出任何包名。

现在,我正在从另一个名为ReadFilesInFolders.java 的java 程序编译和执行上述java 程序。下面是代码sn-p:

try {
    Runtime.getRuntime().exec("javac input\\master\\Kajari_G\\MemoryComparison.java");
    Runtime.getRuntime().exec("java -cp input\\master\\Kajari_G\\ MemoryComparison > output\\output1.txt");
     } catch (IOException e) {
    e.printStackTrace();
     }

现在,第一个 exec 工作正常,并且在 MemoryComparison.java 所在的同一文件夹中生成了 .class 文件。但似乎第二个 exec 没有工作,因为没有创建 output1.txt。

但是当我从命令提示符运行上述两行时,一切正常,并且正在创建 output1.txt。

你能帮我解决这个问题吗!

【问题讨论】:

  • 需要空格,因为它在 -cp 参数之后。这个确切的命令在命令行中运行良好。
  • @kajarigd Runtime.exec() 只执行您提供的内容,而无需执行元字符和文件重定向。因此,">output/output1.txt" 没有意义。如果您打算用 Java 编写批处理文件或 shell 脚本,您将很难除非您学习了基础知识。但是,当你这样做时,你可能只会用 BAT、sh 或 perl 编写它。

标签: java command-line javac


【解决方案1】:

在执行下一个过程之前,您需要等待第一个过程完成。

Process p = Runtime.getRuntime().exec("javac ...");
p.waitFor();
p = Runtime.getRuntime().exec("java ...");
p.waitFor();

【讨论】:

    【解决方案2】:

    试试这个代码。

        Process proc = null;
        try {
            String command = "javac input\\master\\Kajari_G\\MemoryComparison.java";
            // Similarly for this: "java -cp input\\master\\Kajari_G\\ MemoryComparison > output\\output1.txt" also           
            proc = Runtime.getRuntime().exec(new String[] { "/bin/sh"//$NON-NLS-1$
                    , "-c", command });//$NON-NLS-1$
            if (proc != null) {
                proc.waitFor();
            }
        } catch (Exception e) {
            //Handle
            return;
        }
    

    编辑

    在 Windows 上使用 **cmd** exe 路径而不是 /bin/sh。检查**cmd** exe是否支持-c命令行参数。

    【讨论】:

      【解决方案3】:

      您需要使用ProcessBuilder 来重定向... 通常使用Java 的ProcessBuilder API 是一个好习惯

      这是一个示例from,它使用修改后的工作目录和环境启动进程,并将标准输出和错误重定向到附加到日志文件中:

      ProcessBuilder pb = new ProcessBuilder("myCommand", "myArg1", "myArg2");
      Map<String, String> env = pb.environment();
      env.put("VAR1", "myValue");
      env.remove("OTHERVAR");
      env.put("VAR2", env.get("VAR1") + "suffix");
      pb.directory(new File("myDir"));
      File log = new File("log");
      pb.redirectErrorStream(true);
      pb.redirectOutput(Redirect.appendTo(log));
      Process p = pb.start();
      assert pb.redirectInput() == Redirect.PIPE;
      assert pb.redirectOutput().file() == log;
      assert p.getInputStream().read() == -1;
      

      【讨论】:

      • 我正在使用这样的 ProcessBuilder: ProcessBuilder builder = new ProcessBuilder("java", "-cp input\\master\\Kajari_G\\ MemoryComparison"); builder.redirectOutput(new File("output\\output1.txt")); builder.redirectError(new File("output\\output1.txt"));现在正在创建输出文件,但出现错误:错误:无法创建 Java 虚拟机。错误:发生了致命异常。程序将会退出。无法识别的选项:-cp input\master\Kajari_G\ MemoryComparison builder.start();
      • 您会将此添加为评论,因为它不是一个完整的答案
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-14
      相关资源
      最近更新 更多