Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用ProcessBuilder运行多个程序_Java_Processbuilder - Fatal编程技术网

Java 使用ProcessBuilder运行多个程序

Java 使用ProcessBuilder运行多个程序,java,processbuilder,Java,Processbuilder,我试图为我这学期教的Java编程课创建一个自动签名器。自动签名器的基本思想是,它将把我的tester的.class文件的副本放在与学生的交卷相同的位置(每个都放在自己的文件夹中)。它将在文本文件中报告结果,并将数据返回给我 我一直坚持的问题是,我无法让ProcessBuilder执行我的tester类,我尝试了各种不同的方法键入命令,但我不确定正确的命令是什么。代码如下: public...main(String[] args){ ///Code not relevant ommitted

我试图为我这学期教的Java编程课创建一个自动签名器。自动签名器的基本思想是,它将把我的tester的.class文件的副本放在与学生的交卷相同的位置(每个都放在自己的文件夹中)。它将在文本文件中报告结果,并将数据返回给我

我一直坚持的问题是,我无法让ProcessBuilder执行我的tester类,我尝试了各种不同的方法键入命令,但我不确定正确的命令是什么。代码如下:

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();
    }
}
“uniqueId”是一个字符串数组,其中包含每个学生的uniqueId,这是他们的家庭作业提交到的文件夹的名称。“HW_ID”是一个常量,是为所有学生设置的交卷所在文件夹的名称。所以文件结构是:HW_ID/uniqueID/

“Grader”是我的课程名称,该课程将为turnins评分。如何使用ProcessBuilder启动位于指定文件位置的分级程序


编辑:我用的是Mac电脑,但如果Windows的代码不同,请列出两者。谢谢

您需要用逗号分隔流程参数,而不是使用+。否则,它将它们定义为单个参数“javacp”


。。。g=new ProcessBuilder(“bash”、“-c”、“java”、“-cp”、…

假设您尝试运行的程序是一个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();}
  }
}

希望这有帮助。

您遇到了什么错误?您的第五行不需要且多余。请删除currentLoc=new文件(currentLoc.getAbsolutePath());若要使用ProcessBuilder运行java程序,请尝试以下操作:ProcessBuilder(“java.exe”,“-cp”,currentLoc.getAbsolutePath())@ A4L没有错误报告。代码运行,但应该从分级器的执行中创建的文本文件不存在,这表明对平地机的调用没有正确通过。方法返回一个int,这是COMMAD执行的存在状态,请评估它。也考虑埃里克的答案,取一个数组或列表WH。在每个元素都是单个参数的情况下,如果多个参数被手动连接,它们将作为单个参数传递。我已经阅读了关于使用输入流和缓冲读写器的人的事情……我是否需要考虑,即使平衡器程序只输出文本文件吗?因此,从“CurrutLoC.toStrug……”…………应该仍然有+符号,因为这是需要运行的程序的文件路径,对吗?老实说,您的-cp在我看来不像是包含java类的目录或jar,所以很难说。但是您应该将路径参数传递给文件对象本身,并使用currentLoc.getPath()或者像getAbsolutePath()这样的参数作为您的cp参数(这也可以帮助您解决路径中任何特定于平台的问题)。因此,我建议将文件移动到for循环中。编辑代码以反映该建议。似乎仍然不起作用。是否有可能我需要使用InputStreams和BufferedReader,即使我没有任何控制台输出,只有文本文件?此处不需要输入流。“cp”中的空格当我尝试使用“java”-cp”时,可能会出现问题。在shell中,我得到的输出与“java-cp”不同。要将我的情况与本例进行比较,请使用SerialNumber.java文件(我的分级器)位于目录中比运行Tester.java的位置更远的两个文件夹级别。确定程序的位置,并在声明文件对象时进行设置:File currentLoc=new File(“folder1”+File.separator+“folder2”+File.separator+“SerialNumber”);在您的情况下,您可能希望使用来自命令行的值替换字符串文字folder1和folder2:File currentLoc=new File(args[0]+File.separator+args[1]+File.separator+“SerialNumber”);