2014-03-01 3 views
0

Почему это не печатает «сделано»?Не удается распечатать строку после записи через вход сканера - Java

public class Main { 


public static void main(String[] args) { 

    Scanner s = new Scanner(System.in); 

    while (s.hasNext()) { 

     System.out.println(s.nextInt()); 

    } 

    System.out.println("done"); 

} 

} 

Он печатает вход только отлично, но не печатает слово сделано.

EDIT если я входных чисел, разделенных пробелами в консоли, а затем нажмите клавишу ВВОД, он печатает все целые числа я введенные в отдельной строке, но он просто не печатает слово сделано после того, как все, что

EDIT

это работает ... но, кажется, не очень элегантно

public class Main { 


public static void main(String[] args) { 

    Scanner s = new Scanner(System.in); 

    int temp; 

    while (s.hasNext()) { 

     temp = s.nextInt(); 

     if (temp != -99) { 
      System.out.println(temp); 
     } else { 
      break; 
     } 

    } 



    System.out.println("done"); 

} 

} 
+0

Произошел ли поток ввода? (Ctrl-D в Linux, Ctrl-Z и Enter в Windows) – immibis

+0

Я не уверен, что понимаю ваш вопрос. Если сканер имеетNext(), но он пуст, не должен ли он печатать 0? – A2345sooted

+0

Он будет ждать, пока вы что-нибудь напечатаете. hasNext вернет false, если вы читали из файла, и вы дошли до конца файла, или вы читали из сетевого подключения, и сервер закрыл соединение. – immibis

ответ

1

Что вы видите, так это то, что сканер блокирует входной поток, где нет символов, и просто ждет большего. Чтобы сигнализировать конец потока, необходимо отправить символ «конец потока». Это ctrl-d на linux.

Из документации java.util.Scanner (http://docs.oracle.com/javase/7/docs/api/java/util/Scanner.html).

Both hasNext 
and next methods may block waiting for further input. Whether a hasNext method 
blocks has no connection to whether or not its associated next method will block. 

Например, из команды Linux быстрой

> javac Main.java 
> java Main 
> 810 
810 
> 22 
22 
> foo 
java.util.InputMismatchException 
> java Main 
> 1 
1 
> ctrl-D 
done 

Другой способ проверить это эхо линии или кошке файла в программе:

> echo 2 | java Main 
2 
done 

EDIT:

Учитывая желаемый результат, описанный в комментариях ниже; Попробуйте следующее: он будет читаться только в одной строке. Разделите пространство, разделенное ints out, эхом их по одному на строку и затем распечатайте.

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.util.Scanner; 


/** 
* 
*/ 
public class Main { 


    public static void main(String[] args) throws IOException { 

     String str = new BufferedReader(new InputStreamReader(System.in)).readLine(); 

     Scanner s = new Scanner(str); 

     while (s.hasNext()) { 

      System.out.println(s.nextInt()); 

     } 

     System.out.println("done"); 

    } 

} 

EDIT EDIT: Убрал ответ и обработал информацию из комментариев.

+0

поэтому, если я вводим целые числа ввода, а затем нажимаю enter, он печатает целые числа, но не «done» ... тогда, если я нажимаю ctrl-d, он печатает «done» ... но мне нужно, чтобы это произошло после того, как я нажал Enter после ввода last integer – A2345sooted

+0

Вам нужно это поведение при вводе ввода или вы можете подключить его из другого файла? На какой платформе вы работаете, linux, windows, osx? –

+0

Когда я запускаю программу, мне нужно иметь возможность вводить целые числа, разделенные пробелами, а затем входить и запускать все ... не может ударить ctrl-d или что-то еще ... нажатие Enter должно возобновить программу до завершения – A2345sooted

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