Я пытаюсь получить размер терминала (TTY под Linux / MacOS, командная строка Windows), и здесь я полагаюсь на управляющий код VT100 (получить позицию курсора), потому что я не хочу использовать дополнительную библиотеку, например "Jline3 "только из-за сбора информации о терминале, такой как строки и столбцы.
Он выводит правильный размер терминала, однако я сталкиваюсь с двумя небольшими проблемами:
- Я вынужден нажать клавишуКлавиша ENTER, которую я моделирую с помощью
java.awt.Robot
- Вывод курсора распечатывается, когда я пытаюсь прочитать последовательности символов, используя
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);
}
}
Вывод:

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