Как создать поток Java 8 из System.in/System.console()?

Учитывая файл, мы можем преобразовать его в поток строк, используя, например,

Stream<String> lines = Files.lines(Paths.get("input.txt"))

Можно ли построить поток строк со стандартного ввода аналогичным образом?

Ответ 1

Компиляция ответа kocko и комментария Хольгера:

BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
Stream<String> stream = in.lines().limit(numberOfLinesToBeRead);

Ответ 2

Вы можете использовать только Scanner в сочетании с Stream::generate:

Scanner in = new Scanner(System.in);
List<String> input = Stream.generate(in::next)
                           .limit(numberOfLinesToBeRead)
                           .collect(Collectors.toList());

или (чтобы избежать NoSuchElementException если пользователь завершает работу до достижения лимита):

Iterable<String> it = () -> new Scanner(System.in);

List<String> input = StreamSupport.stream(it.spliterator(), false)
            .limit(numberOfLinesToBeRead)
            .collect(Collectors.toList());

Ответ 3

Обычно стандартный ввод считывается по строкам, поэтому вы можете сохранить всю прочитанную строку в коллекцию, а затем создать Stream, которая работает на ней.

Например:

List<String> allReadLines = new ArrayList<String>();

BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
String s;
while ((s = in.readLine()) != null && s.length() != 0) {
    allReadLines.add(s);
}

Stream<String> stream = allReadLines.stream();