我正在尝试为我的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的代码不同,请列出两者。谢谢!答案 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();}
}
}
希望这有帮助。