我知道有很多关于此的话题,但没有一个对我有用。这是我正在尝试做的事情:
Javac 并从我的 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 相比,Terminal 需要一个 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");
什么都不做。(什么也没发生。终端“执行”时没有错误消息。)在终端中手动输入此命令会按预期构建和运行。我错过了什么?
最佳答案
我这里没有 Linux 系统可以玩,但我很确定上面的第二个命令正在尝试编译名为“Test.java”、“&&”、“java”和“Test”的 Java 文件";换句话说,Runtime.exec() 方法按字面意思处理参数,而不是应用 shell 解释。
您可能会按照以下方式使用它:
Process p = Runtime.getRuntime().exec(
new String[] { "sh", "-c", "javac Test.java && java Test" });
关于java - 从java执行终端命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26468715/