Runtime.getRuntime()中的命令.exec无法正常工作

时间:2014-02-20 13:03:39

标签: java command-line javac

我有一个名为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程序。以下是代码段:

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工作正常,而.class文件是在MemoryComparison.java所在的同一文件夹中生成的。但似乎第二个exec没有工作,因为没有创建output1.txt。

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

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

3 个答案:

答案 0 :(得分:4)

试试这段代码。

    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命令行参数。

答案 1 :(得分:2)

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

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

答案 2 :(得分:0)

您需要使用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;