从java执行终端命令

时间:2014-10-20 14:57:13

标签: java terminal command

我知道有很多线索,但这些都不适合我。这是我想要做的:

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'");

它什么都不做。没有按摩。

我很感激任何意见。

UPDATE ------------------------------------------- -----------------

与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();

但事情仍然是神秘的,因为执行

  

进程p = Runtime.getRuntime()。exec(“javac Test.java”);

工作并生成Test.class文件。但是

  

进程p = Runtime.getRuntime()。exec(“javac Test.java&& java Test”);

什么都不做。(没有任何反应。终端“执行”而没有错误按摩。)在终端版本中手动输入并按预期运行。我错过了什么?

1 个答案:

答案 0 :(得分:1)

我这里没有Linux系统可供使用,但我很确定上面的第二个命令是尝试编译名为“Test.java”,“&&”,“java”的Java文件和“测试”;换句话说,Runtime.exec()方法按字面处理参数而不是应用shell解释。

你可能可以使用以下内容:

Process p = Runtime.getRuntime().exec(
    new String[] { "sh",  "-c", "javac Test.java && java Test" });