Почему мой цикл while с system.in.read() не может получить последнюю строку в консоли?

Я застрял с проблемой, связанной с System.in.read(). Я хочу распечатать все, что вставлено в консоль. Мой код выглядит так:

import java.io.IOException;

public class printer {
    public static void main(String[ ] args) { 
        int i;
        try {
            while ((i = System.in.read()) != -1) {
                char c = (char)i;
                System.out.print(c);
            }
        }
        catch (IOException e) {
            e.printStackTrace();
        }
    }
}
  1. Проблема в том, что если вы вставите, например, три строки в консоль, программа напечатает две первые строки, но не третью. Это почему? Он печатает третью, если я нажимаю ввод, но с огромным пробелом между второй и третьей строкой.

  2. Я также пытался сохранить каждый символ в строке, а затем распечатать всю строку после цикла, но цикл никогда не заканчивается. Это способ остановить этот конкретный цикл (я не буду знать, сколько строк вставит пользователь)


person user3712130    schedule 09.06.2014    source источник
comment
Пожалуйста, ознакомьтесь с это обсуждение.   -  person Uluaiv    schedule 09.06.2014
comment
То, что вы пытаетесь, сильно зависит от системы: сначала от того, что именно вставлено, а затем от управления входным буфером. Не могли бы вы сказать, в какой системе вы работаете (Windows, Linux,...). В любом случае вы должны попытаться записать коды символов, которые вы читаете.   -  person Serge Ballesta    schedule 09.06.2014


Ответы (1)


Ваше приложение повторяет любую строку, которую вы вводите (или вставляете) в консоли. Проблема в том, что консоли ушли в прошлое, и предполагалось, что они будут делать что-то построчно. Это означает, что ваше приложение печатает только после прочтения символа новой строки, потому что System.in.read блокирует.

Вставляемый текст уже содержит два разрыва строки, но в последней строке этот разделитель отсутствует. Это то, что вы публикуете, где <nl> означает разрыв строки:

    line1<nl>line2<nl>line3

Если вы зайдете в свой любимый текстовый редактор, вставите туда, добавите дополнительный разрыв строки в конце и снова скопируете все с помощью меню «выбрать все», вы увидите последнюю строку.

person Mister Smith    schedule 09.06.2014
comment
Хорошо, я понимаю, но я не смогу добавить ‹nl› после последней строки в каждый текст консоли. Можно ли как-нибудь включить последнюю строку (даже если в конце нет ‹nl›)? И можно ли остановить цикл после того, как пользователь вставил текст в консоль? - person user3712130; 09.06.2014
comment
Вы можете взять текст прямо из буфера обмена. Взгляните на этот ответ. Что касается второго вопроса, цикл завершается только тогда, когда read возвращает -1, и это произойдет, если консоль закроет поток (извините, я не знаю о конкретном задействованном механизме). - person Mister Smith; 10.06.2014