Есть ли способ избежать «нажатия клавиши ввода» при чтении строк из стандартного ввода с помощью BufferedReader?

Ниже приведена простая, но полностью работающая программа на Java, демонстрирующая мою проблему:

package bufferedreader_test;

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

public class BufferedReaderTest {

    public static void main(String[] args) {
        try {
            InputStreamReader isr = new InputStreamReader(System.in);
            BufferedReader br = new BufferedReader(isr);
            String line[] = new String[2];

            for (int i=0; i<2; i++) 
                line[i] = br.readLine();

            for (int j=0; j<line.length; j++)
                System.out.println(line[j]);
        } 
        catch (IOException e) {
            e.printStackTrace();
        }
    }
}

Если вы скопируете и вставите 2 строки в консоль, она не распечатает их сразу, а будет ждать, пока вы нажмете клавишу Enter (т. е. вставите новую строку в стандартный ввод).

Например:

Есть ли способ «обмануть систему» ​​для печати результата, как только будет прочитана 2-я строка, не дожидаясь клавиши Enter (3-я строка?)?

line[i] = br.readLine(); readLine — это метод блокировки, который блокирует весь поток программы до тех пор, пока не получит токен конца строки.
Hovercraft Full Of Eels 31.10.2022 18:30

Небольшое дальнейшее исследование обнаруживает этот пост, который подтверждает мое подозрение, что это невозможно сделать на чистой Java.

Jim Garrison 31.10.2022 18:50

Или попробуйте эту кроличью нору

Jim Garrison 31.10.2022 18:56

Спасибо, @JimGarrison. Я столкнулся с этой проблемой только потому, что пытался правильно отправить свое решение по адресу hackerrank.com/challenges/linkedin-practice-graph-theory-bfs‌​/…, но это продолжает приводить к ошибке времени выполнения «~ нет ответ на стандартный вывод ~", несмотря на то, что он отлично работает в моей настройке Eclipse. Интересно, чего ожидает этот сайт.

WebViewer 31.10.2022 19:01

Вероятно, происходит то, что ввод поступает из файла, а не из консоли, и в конце второй строки нет \n. Таким образом, вместо этого код видит EOF.

Jim Garrison 31.10.2022 19:04
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
5
53
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

У вас две проблемы:

  1. На самом деле консоль ничего не отправляет вашей программе, пока вы не нажмете ENTER. Это позволяет редактировать строку перед ее отправкой. Существуют специфичные для ОС способы обойти это, но вы ничего не можете с этим поделать в чистом/портативном java.

  2. br.readLine() не знает, что строка закончилась, пока не получит символ перевода строки, который консоль помещает в конец текста при нажатии ENTER. Без клавиши ввода как он узнает, что вы закончили печатать? Вы также можете ввести символ EOF для конкретной ОС (вероятно, ctrl-Z или ctrl-D), чтобы завершить ввод с консоли, но это, вероятно, не то, что вам нужно.

Если вы хотите решить эту проблему только для ручного копирования и вставки, то, возможно, вы можете просто выбрать перевод строки перед копированием, перетащив его до строки 3.

Выбор перевода строки перед копированием путем перетаскивания до строки 3 — хороший обходной путь, и он работает! Однако я не могу использовать это решение в следующем автоматизированном тесте, который не вводит эту дополнительную строку. В результате происходит сбой с ошибкой выполнения «~ no response on stdout ~»: hackerrank.com/challenges/linkedin-practice-graph-theory-bfs‌​/…

WebViewer 31.10.2022 18:49

hackerrank не даст вам ввод без перевода строки. Код, который вы разместили, не подходит для чтения ввода в этой задаче.

Matt Timmermans 31.10.2022 20:21

Что подходит (в Java) для чтения ввода в этой задаче? Поможет ли чтение ввода посимвольно (например, с помощью InputStreamReader(System.in).read ())?

WebViewer 31.10.2022 20:39

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

Matt Timmermans 31.10.2022 20:44

Переменное количество строк известно сразу после прочтения первой строки, поэтому я позаботился об этом (проверено на моей среде разработки). Моя единственная проблема заключается в том, что в конце требуется дополнительный CRLF/EOF, как вы правильно указали. Я попробовал Java Scanner.nextInt(), но получил те же результаты. Интересно, чего ожидает этот сайт. Принимаю ваш ответ, так как, похоже, нет решения/обходного пути для проблемы, с которой я столкнулся.

WebViewer 01.11.2022 14:26

Вы должны опубликовать свой фактический код обработки ввода. Проблема не в том, что вы думаете.

Matt Timmermans 01.11.2022 23:58

Другие вопросы по теме