2014-02-15 3 views
0

Я пытаюсь написать автоматическую программу оценки в java для других java-программ. Моя программа Java использует ProcessBuilder для создания процесса (с перенаправленным выводом ошибок), а затем выполняет класс java студента.Java Process и использование InputStream и OutputStream

Проблема в том, что я блокируюсь, когда пытаюсь читать из их выходного потока.

Теперь, когда я пытаюсь запустить свою программу только в терминале, я стараюсь делать все входные данные сразу, но по какой-то причине я получаю такое же блокирующее поведение. Их программа запрашивает целое число, а затем кучу строк. Если я набираю целое число, а затем пробел, за которым следует вход, программа не работает правильно, и я блокируюсь.

Это программа студента. Предположим, что объект 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]); 
      } 
     } 



    } 
} 

ответ

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

+0

хммм ... по какой-то причине я все еще получаю заблокирован, когда я исполню ее в стандартном терминале Ubuntu .... – Matthew

+0

Какую версию JDK вы используете? Я использую 1.7. Я запускаю Ubuntu 12.04, и он отлично работает из командной строки. –

Смежные вопросы