我知道有很多关于这个问题的帖子,但是没有一个适用于我。这是我想做的:
从我的Java代码中编译和运行一个文件。在Windows上可以工作,但我也想让它在UNIX上工作。这里是代码:
if(os.equals("win")){
//For Windows
try {
Runtime.getRuntime().exec(
"cmd /c start cmd.exe /K "
+ "\"cd " + path + "&& "
+ "javac " + name + ".java && "
+ "echo ^>^>" + name + ".java " + "outputs: &&"
+ "echo. &&"
+ "java " + name + " && "
+ "echo. &&"
+ "pause && "
+ "exit\"");
} catch (IOException e) {
System.out.println("Didn't work");
}
}else{
try {
//TODO make it work for UNIX
Runtime.getRuntime().exec("");
} catch (IOException e) {
System.out.println("Didn't work");
}
}
问题是,在UNIX系统上,它的行为是“不可预测的”。 例如:
Runtime.getRuntime().exec("open image.png");
打开这张图片但是
Runtime.getRuntime().exec("javac Test.java");
Runtime.getRuntime().exec("echo 'hello'");
它什么也不做,没有信息。
我非常感谢任何输入。
更新------------------------------------------------------------
似乎与Windows CMD相比,终端需要一个InputStreamReader来显示exec中发生了什么。我在另一个线程中找到了这段代码,现在至少可以从exec终端获得一些输出。
String line;
Process p = Runtime.getRuntime().exec( "echo HelloWorld2" );
BufferedReader in = new BufferedReader(
new InputStreamReader(p.getInputStream()) );
while ((line = in.readLine()) != null) {
System.out.println(line);
}
in.close();
但事情仍然是神秘的,因为执行
Process p = Runtime.getRuntime().exec("javac Test.java");
可以工作并生成一个Test.class文件。但是
Process p = Runtime.getRuntime().exec("javac Test.java && java Test");
却没做任何事情。(没有任何错误消息。终端“执行”但是没有结果。)在终端中手动输入此命令会按预期构建并运行。我错过了什么?