Получение размера терминала (TTY, Командная строка) с использованием Java - PullRequest
2 голосов
/ 15 октября 2019

Я пытаюсь получить размер терминала (TTY под Linux / MacOS, командная строка Windows), и здесь я полагаюсь на управляющий код VT100 (получить позицию курсора), потому что я не хочу использовать дополнительную библиотеку, например "Jline3 "только из-за сбора информации о терминале, такой как строки и столбцы.

Он выводит правильный размер терминала, однако я сталкиваюсь с двумя небольшими проблемами:

  1. Я вынужден нажать клавишуКлавиша ENTER, которую я моделирую с помощью java.awt.Robot
  2. Вывод курсора распечатывается, когда я пытаюсь прочитать последовательности символов, используя System.in (уже пробовал Scanner, BufferedInputStream и т. Д.). . тот же эффект)

Вот минимальный пример:

import java.awt.Robot;
import java.awt.event.KeyEvent;
import java.util.Arrays;

public class TTYTest2 {
    public static void main(String[] args) throws Throwable {
        // Prints out e.g. "^[[30;120R" (=30 rows, 120 cols)
        // 1) simulate cursor moving to row 999, col 999
        // 2) request for cursor position
        System.out.println("\033[999;999H\033[6n");

        // The rows / columns of TTY will be printed out
        // --> however, I have to simulate VK_ENTER as it awaits my ENTER input
        // new Robot().keyPress(KeyEvent.VK_ENTER);

        // read the stdin "^[[30;120R" -> "30;120"
        final var sb = new StringBuilder();
        while (System.in.available() != -1) {
            char ch = (char) System.in.read();
            if (ch == 'R') break;
            if (Character.isDigit(ch) || ch == ';') sb.append(ch);
        }

        final var result = sb.toString();
        System.out.println("Result: " + result);

        final var rowsAndCols = result.split(";");
        System.out.println("Result (splitted): " + Arrays.toString(rowsAndCols));

        final var rows = Integer.valueOf(rowsAndCols[0]);
        final var cols = Integer.valueOf(rowsAndCols[1]);
        System.out.println("Rows: " + rows + ", Cols: " + cols);
    }
}

Вывод:

enter image description here

ВОПРОС 1: Есть ли способ прочитать курсор получения БЕЗ нажатия клавиши ENTER (пользователем или Robot#keyPress симуляцией)?

ВОПРОС 2: Ивозможно БЕЗ повторения позиции курсора?

Спасибо, Крис

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