使用ProcessBuilder运行多个程序

时间:2014-01-21 21:50:31

标签: java processbuilder

我正在尝试为我的Java编程类创建一个自动编程器,我正在教这个学期。自动编程器的基本思想是它会将我的测试人员.class文件的副本放在与学生的转折位置相同的位置(每个都在他们自己的文件夹中)。它将在文本文件中报告结果并将数据提供给我。

我坚持的问题是我无法让ProcessBuilder执行我的测试器类,我尝试了各种不同的输入命令的方法,但我不确定正确的命令是什么。这是代码:

public...main(String[] args){
///Code not relevant ommitted
    Runtime runtime = Runtime.getRuntime();

    for (String person : uniqueIds) {
        File currentLoc = new File(HW_ID + "/" + person);
        ProcessBuilder g = new ProcessBuilder("bash", "-c",
                "java", " -cp ", currentLoc.getAbsolutePath(),
                " Grader");
        Process process = g.start();
        process.waitFor();
    }
}

“uniqueIds”是一个字符串数组,其中包含每个学生的uniqueId,这是他们的作业所在的文件夹的名称。 “HW_ID”是一个常量,它是为所有学生设置的转折所在的文件夹的名称。因此文件结构为:HW_ID / uniqueID /

“Grader”是我的程序的名称,它将对转折进行评级。如何使用ProcessBuilder启动位于指定文件位置的Grader程序?

编辑:我正在使用Mac,但如果Windows的代码不同,请列出两者。谢谢!

2 个答案:

答案 0 :(得分:2)

您需要使用逗号分隔进程参数,而不是使用+。否则它将它们连成一个参数“java-cp”...

... g = new ProcessBuilder(“bash”,“ - c”,“java”,“ - cp”,...

答案 1 :(得分:0)

假设您尝试运行的程序是Java程序并且它存在于同一个当前目录中,下面是一个示例,说明如何从另一个名为Tester.java的程序运行名为SerialNumber.java的程序。

SerialNumber.java:

import java.io.*;

public class SerialNumber
{
  public static void main(String[] args)
  {
    try{
      SerialNumber sn = new SerialNumber();
      System.out.println(sn.executeVolCommand());
    }
    catch(Exception e){e.printStackTrace();} 
  }

  public String executeVolCommand()
  {
    String NEWLINE = System.getProperty("line.separator");
    StringBuffer buffer = new StringBuffer();
    try{

      Process pb = new ProcessBuilder("cmd","/c", "vol").start();  
      InputStream in = pb.getInputStream();  
      BufferedReader br = new BufferedReader(new InputStreamReader(in));  
      String line;  
      while ((line = br.readLine()) != null) {  
        buffer.append(line + NEWLINE);  
      }
    }
    catch(Exception e){e.printStackTrace();}
    return buffer.toString(); 
  }
}

Tester.java:

import java.io.*;

public class Tester
{
  public static void main(String[] args)
  {
    try{
      File currentLoc = new File("SerialNumber");
      System.out.println(currentLoc.getAbsolutePath());
      ProcessBuilder pb = new ProcessBuilder("java.exe",currentLoc.getName());
      Process p = pb.start();

      //Read out dir output
      InputStream is = p.getInputStream();
      InputStreamReader isr = new InputStreamReader(is);
      BufferedReader br = new BufferedReader(isr);
      String line;

      while ((line = br.readLine()) != null) {
        System.out.println(line);
      }
    }
    catch(Exception e){e.printStackTrace();}
  }
}

希望这有帮助。