Процесс Java и использование InputStream и OutputStream

Я пытаюсь написать программу автоматической оценки в 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]);
            }
        }



    }
}

person Matthew    schedule 15.02.2014    source источник


Ответы (1)


Эта программа отлично работает для меня, когда я запускаю ее в 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();

  }
}

ХТН

person J Steven Perry    schedule 15.02.2014
comment
хммм... по какой-то причине меня все еще блокируют, когда я запускаю его в стандартном терминале Ubuntu.... - person Matthew; 15.02.2014
comment
Какую версию JDK вы используете? Я использую 1.7. Я использую Ubuntu 12.04, и он также отлично работает из командной строки. - person J Steven Perry; 16.02.2014