Java Process并使用InputStream和OutputStream

时间:2014-02-15 16:02:06

标签: java java.util.scanner bufferedreader processbuilder

我正在尝试在java中为其他java程序编写自动评分程序。我的java程序使用ProcessBuilder创建一个进程(带有重定向的错误输出),然后执行学生的java类。

问题是,当我尝试从他们的输出流中读取时,我被阻止了。

现在作为测试,当我尝试在终端中单独运行他们的程序时,我尝试一次完成所有输入,但由于某种原因,我得到了相同的阻塞行为。他们的程序要求一个整数,然后是一串字符串。如果我输入整数,然后输入空格键,然后输入,程序将无法正常工作,我会被阻止。

这是学生的课程。假设Mid对象只是一个整数和一些字符串。尝试运行这个程序,然后输入实际上只需输入类似......

2 123456 matt smith 2 123455 jim bob 2 4  <- after the 4 hit enter

并观看程序的默认“阻止”行为。

import java.util.*;
public class HW3
{
    public static Mid createMid()
    {
        Scanner in = new Scanner(System.in);
        Mid myMid = new Mid();


        System.out.print("Alpha? ");
        myMid.alpha = in.next();
        System.out.print("First name? ");
        myMid.firstName = in.next();
        System.out.print("Last name? ");
        myMid.lastName = in.next();
        System.out.print("Company? ");
        myMid.company = in.nextInt();


        return myMid;
    }
    public static void printMid(Mid x)
    {
        System.out.println("" + x.alpha + " " + x.lastName + " " + x.firstName + " " + x.company);

        return;
    }
    public static void main(String[] args)
    {
        Scanner in = new Scanner(System.in);
        System.out.println("Welcome to my HW3");

        System.out.print("How many mids? ");
        int numberMids = in.nextInt();
        System.out.println("Is this your number..."+numberMids);
    Mid[] arrayMids =  new Mid[numberMids];
        for(int i = 0; i < numberMids; i++)
        {
            arrayMids[i] = createMid();
        }

        System.out.print("What company would you like to print out? ");
        int printCompany = in.nextInt();
        for(int j = 0; j < numberMids; j++)
        {
            if(printCompany == arrayMids[j].company)
            {
                printMid(arrayMids[j]);
            }
        }



    }
}

1 个答案:

答案 0 :(得分:0)

当我在Eclipse中运行它(并创建一个Mid类)时,这个程序对我来说很好。您需要做的一件事是打印您实际输入的公司。如果您研究了您建议输入的输入行,那么这些公司都是2,但您要求打印公司4

当我这样做时,没有任何内容打印出来(当然),但程序运行完成就好了。

当被要求打印时,如果我进入我实际输入的公司作为输入,这就是我所看到的:

Welcome to my HW3
How many mids? 2
Is this your number...2
Alpha? 123456
First name? matt
Last name? smith
Company? 2
Alpha? 123455
First name? jim
Last name? bob
Company? 2
What company would you like to print out? 2
123456 smith matt 2
123455 bob jim 2

哦,确保关闭扫描仪。完成使用后清理资源只是一种很好的编程习惯。

完整的代码清单我以前在Eclipse(Kepler)中运行它:

import java.util.Scanner;

public class HW3 {

  public static class Mid {
    String alpha;
    String lastName;
    String firstName;
    int company;
  }

  public static Mid createMid() {
    Scanner in = new Scanner(System.in);
    Mid myMid = new Mid();

    System.out.print("Alpha? ");
    myMid.alpha = in.next();
    System.out.print("First name? ");
        myMid.firstName = in.next();
    System.out.print("Last name? ");
    myMid.lastName = in.next();
    System.out.print("Company? ");
    myMid.company = in.nextInt();

    in.close();

    return myMid;
  }

 public static void printMid(Mid x) {
   System.out.println("" + x.alpha + " " + x.lastName + " " + x.firstName
        + " " + x.company);

    return;
  }

  public static void main(String[] args) {
    Scanner in = new Scanner(System.in);
    System.out.println("Welcome to my HW3");

    System.out.print("How many mids? ");
    int numberMids = in.nextInt();
    System.out.println("Is this your number..." + numberMids);
    Mid[] arrayMids = new Mid[numberMids];
    for (int i = 0; i < numberMids; i++) {
      arrayMids[i] = createMid();
    }

    System.out.print("What company would you like to print out? ");
    int printCompany = in.nextInt();
    for (int j = 0; j < numberMids; j++) {
      if (printCompany == arrayMids[j].company) {
        printMid(arrayMids[j]);
      }
    }

    in.close();

  }
}

HTH