我有一个名为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。
你能帮我解决这个问题吗?
答案 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;