Java: next() сканера действует по-разному в Scite и командной строке

Я пробую очень простую программу Java, которая использует Scanner и его метод next(), и каким-то образом я сталкиваюсь со странной ситуацией. Вот код:

import java.util.Scanner;
public class Test
{
    public static void main(String[] args)
    {
        Scanner scan = new Scanner(System.in);
        String input = "";

        System.out.println("Enter a sentence here: ");

        while(!input.endsWith("."))
        {
            input = scan.next();
            System.out.println("Echo: " + input);
        }
    }
}

Если я запускаю его в Scite, каждый раз, когда я набираю пробел после слова, строка «Echo:» + введенное слово будет печататься сразу после пробела.

Предположим, я набираю ввод на клавиатуре следующим образом:

apple orange mango.

На сите это будет выглядеть так:

Enter a sentence here:
apple Echo: apple
orange Echo: orange
mango. Echo: mango.

Но если я запущу его в командной строке и введу тот же ввод, это будет выглядеть так:

Enter a sentence here: 
apple orange mango.
Echo: apple
Echo: orange
Echo: mango.

Примечание. При запуске в командной строке я должен нажать Enter после того, как наберу «яблочно-апельсиновый манго». или он не будет печатать предложения «Эхо». Также попробовал код в NetBeans, и он дал те же результаты, что и в командной строке.

Почему программа ведет себя иначе?


person ABVincita    schedule 19.11.2011    source источник


Ответы (1)


Буферизация. В командной строке и, по-видимому, в NetBeans поток stdin буферизуется строкой, поэтому ваше приложение не знает, что вы что-то набрали, до того, как вы введете новую строку (или буфер будет заполнен). Scite, по-видимому, не буферизует поток ввода, а сбрасывает его либо после каждого символа, либо после каждого пробела.

person Daniel Fischer    schedule 19.11.2011
comment
Также помните, что stdout заканчивается одинаково в обоих случаях. - person VolatileDream; 19.11.2011
comment
Извините за поздний ответ, но большое спасибо за ответ! теперь я понимаю :) - person ABVincita; 26.11.2011
comment
@ABVincita: От имени Даниэля позвольте мне предложить вам принять ответ, щелкнув значок галочки. Таким образом, сообщество будет знать, что вопрос решен. - person Helgi; 07.12.2011
comment
@Helgi, о, спасибо, что сказал мне это! Простите мой новичок :) - person ABVincita; 10.12.2011