Ниже приведена простая, но полностью работающая программа на 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-я строка?)?
Небольшое дальнейшее исследование обнаруживает этот пост, который подтверждает мое подозрение, что это невозможно сделать на чистой Java.
Или попробуйте эту кроличью нору
Спасибо, @JimGarrison. Я столкнулся с этой проблемой только потому, что пытался правильно отправить свое решение по адресу hackerrank.com/challenges/linkedin-practice-graph-theory-bfs/…, но это продолжает приводить к ошибке времени выполнения «~ нет ответ на стандартный вывод ~", несмотря на то, что он отлично работает в моей настройке Eclipse. Интересно, чего ожидает этот сайт.
Вероятно, происходит то, что ввод поступает из файла, а не из консоли, и в конце второй строки нет \n. Таким образом, вместо этого код видит EOF.




У вас две проблемы:
На самом деле консоль ничего не отправляет вашей программе, пока вы не нажмете ENTER. Это позволяет редактировать строку перед ее отправкой. Существуют специфичные для ОС способы обойти это, но вы ничего не можете с этим поделать в чистом/портативном java.
br.readLine() не знает, что строка закончилась, пока не получит символ перевода строки, который консоль помещает в конец текста при нажатии ENTER. Без клавиши ввода как он узнает, что вы закончили печатать? Вы также можете ввести символ EOF для конкретной ОС (вероятно, ctrl-Z или ctrl-D), чтобы завершить ввод с консоли, но это, вероятно, не то, что вам нужно.
Если вы хотите решить эту проблему только для ручного копирования и вставки, то, возможно, вы можете просто выбрать перевод строки перед копированием, перетащив его до строки 3.
Выбор перевода строки перед копированием путем перетаскивания до строки 3 — хороший обходной путь, и он работает! Однако я не могу использовать это решение в следующем автоматизированном тесте, который не вводит эту дополнительную строку. В результате происходит сбой с ошибкой выполнения «~ no response on stdout ~»: hackerrank.com/challenges/linkedin-practice-graph-theory-bfs/…
hackerrank не даст вам ввод без перевода строки. Код, который вы разместили, не подходит для чтения ввода в этой задаче.
Что подходит (в Java) для чтения ввода в этой задаче? Поможет ли чтение ввода посимвольно (например, с помощью InputStreamReader(System.in).read ())?
Я имею в виду, что входные данные для задачи имеют переменное количество строк, но вы пытаетесь прочитать ровно 2. Вероятно, у вас возникнут проблемы, когда первая строка будет 0, потому что тогда больше нет.
Переменное количество строк известно сразу после прочтения первой строки, поэтому я позаботился об этом (проверено на моей среде разработки). Моя единственная проблема заключается в том, что в конце требуется дополнительный CRLF/EOF, как вы правильно указали. Я попробовал Java Scanner.nextInt(), но получил те же результаты. Интересно, чего ожидает этот сайт. Принимаю ваш ответ, так как, похоже, нет решения/обходного пути для проблемы, с которой я столкнулся.
Вы должны опубликовать свой фактический код обработки ввода. Проблема не в том, что вы думаете.
line[i] = br.readLine();readLine — это метод блокировки, который блокирует весь поток программы до тех пор, пока не получит токен конца строки.