Java Scanner не «закончит» чтение ввода - PullRequest
2 голосов
/ 22 марта 2012

У меня были проблемы с использованием класса Java-сканера.Я могу заставить его читать мои входные данные просто отлично, но проблема в том, когда я хочу что-то вывести.Учитывая несколько строк ввода, я хочу напечатать только ОДНУ строку, когда все данные полностью прочитаны.Вот код, который я использую для чтения ввода:

    public static void main(String[] args){
    Scanner scanner = new Scanner(System.in);   //scanner reads block of input
    while(scanner.hasNextLine()){    
        //body of loop goes here
        String s = scanner.nextLine();
        Scanner ls = new Scanner(s);   //scanner to parse a line of input
        while(ls.hasNext()){
        //body of nested loop goes here
        ls.next();
        }
    }
    System.out.println("Fin");
    }

Даже когда все строки ввода прочитаны, программа не достигает сообщения System.out.println.(Обратите внимание, что сообщение не может никуда идти, иначе оно будет выводиться столько раз, сколько выполняется цикл).Как это исправить?Любая помощь будет принята с благодарностью.

Ответы [ 4 ]

1 голос
/ 22 марта 2012

Как я вижу в вашем внешнем цикле while, вы использовали метод

scanner.hasNextLine();

.Этот метод блокируется, если он должен ждать ввода.Также у вас есть

Scanner scanner = new Scanner(System.in);

заявление.Таким образом, system.in будет все время ожидать ввода, поэтому метод hasNextLine () должен ожидать ввода.Вот почему элемент управления застревает в цикле и не может продолжать работу.

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

0 голосов
/ 18 апреля 2013

магия

Scanner scanner = new Scanner(System.in);
    while(scanner.hasNextLine()){ 

Это то, что никогда не прекратится ввод из системы (если вы не закроете ввод с помощью ctrl + d (для macs)).

Чтобы остановить цикл, я предлагаю добавить в условие нечто большее, чем просто hasNextLine ().

1008 * Е.Г. *

Scanner scanner = new Scanner(System.in);   //scanner reads block of input
    int BLOCK_SIZE  =3,count=1;
    while(scanner.hasNextLine() && count++ <= BLOCK_SIZE){   //<- Use count here.
        //body of loop goes here
        String s = scanner.nextLine();
        Scanner ls = new Scanner(s);   //scanner to parse a line of input
        while(ls.hasNext()){
        //body of nested loop goes here
        ls.next();
        }
    }
    System.out.println("Fin");

}
0 голосов
/ 23 марта 2012

Вы должны сообщить программе, что больше не будет ввода.Это делается путем добавления символа EOF.Это можно сделать вручную в Linux, нажав Ctrl-D на консоли.Я думаю, что на Windows вы можете нажать Ctrl-Z.Поток будет автоматически закрыт, если вы передаете ввод из одной программы в другую.

например.

cat filename | java MyJavaProgram
0 голосов
/ 22 марта 2012

В этом случае вы читаете из бесконечного потока.hasNextLine() будет возвращать значение true, если на входе этого сканера есть другая строка.Как System.in, он будет продолжать чтение с клавиатуры, если вы не прекратите его или не скажете потоку остановиться.

В конце нажмите "Ctrl + Z", вы увидите, что он работает.1005 *

Редактировать : Вы можете сделать что-то вроде этого ...

Scanner scanner = new Scanner(System.in);   //scanner reads block of input
        int BLOCK_SIZE  =3,count=1;
        while(scanner.hasNextLine()){    
            //body of loop goes here
            String s = scanner.nextLine();
            Scanner ls = new Scanner(s);   //scanner to parse a line of input
            while(ls.hasNext()){
            //body of nested loop goes here
            ls.next();
            }
            if(count++==BLOCK_SIZE)
            {
                break;
            }
        }
        System.out.println("Fin");

    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...