Java как читать stdin? - PullRequest
       6

Java как читать stdin?

0 голосов
/ 22 апреля 2020

Мне нужно прочитать входные данные, передаваемые в мою программу java. Это простая задача, но я не смог найти ее на net.

Вот что я пытался:

private static String getInput() throws IOException {
  StringBuilder sb = new StringBuilder();
  BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
  String line;
  while ((line = reader.readLine()) != null) {
    sb.append(line);
  }

  return sb.toString();
}

Прежде всего, есть ли более простой способ сделать это (в java 11 или, может быть, с библиотекой)? Кажется, что для такой простой задачи нужно много строк.

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

Ответы [ 2 ]

1 голос
/ 22 апреля 2020

Начиная с Java 8, вы можете читать все строки в String<Stream>:

private static String getInput() {
    BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
    return reader.lines().collect(Collectors.joining("\n"));
}

Если вы хотите сохранить новые строки, вы можете использовать перегрузку для Collectors.joining(), например Collectors.joining("\n")

Проблема с интерактивным вводом заключается в следующем: вы можете не знать, идет ли другая строка. Таким образом, вы должны сообщить об окончании файла, используя данные операционной системы.
На windows это последовательность Ctrl + Z , а на Linux это Ctrl + D

1 голос
/ 22 апреля 2020

Вы не можете прочитать null из System.in, но вы можете завершить ввод пустой строкой и затем вернуть null, если длина ввода 0.

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        System.out.println(getInput());
    }

    private static String getInput() {
        StringBuilder sb = new StringBuilder();
        final Scanner scanner = new Scanner(System.in);
        for (String line = scanner.nextLine(); !line.isEmpty(); line = scanner.nextLine()) {
            sb.append(line).append(System.lineSeparator());
        }
        return sb.length() == 0 ? null : sb.toString();
    }
}

Пробный прогон:

Hello
World
How are you?

Hello
World
How are you?

Другой пробный прогон:

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