Избегайте управляющих последовательностей (например, ^[[C) из стандартного входного потока Java

#java #shell #input #stdin

#java #оболочка #ввод #стандартный интерфейс

Вопрос:

Код:

 import java.util.Scanner;
public class Try{
  public static void main(String args[]){
    Scanner sc = new Scanner(System.in);
    System.out.println("Enter a String : ");
    String s = sc.nextLine();
    System.out.println("The Entered String is : "   s);
    System.out.println("The Length of Entered String is : "   s.length());
    sc.close();
  }
}
 

Вывод:

 ┌─[jaysmito@parrot]─[~/Desktop]
└──╼ $java Try
Enter a String : 
hello
The Entered String is : hello
The Length of Entered String is : 5
┌─[jaysmito@parrot]─[~/Desktop]
└──╼ $java Try
Enter a String : 
hello^[[C
The Entered String is : hello
The Length of Entered String is : 8
 

Когда я нажимаю клавиши со стрелками, вместо перемещения курсора отображается ^[[C (аналогично происходит с другими клавишами со стрелками, escape, home, end)!

Здесь происходит второй раз, когда строка содержит символы :

 ['h', 'e', 'l', 'l', 'o', 'x1b', '[', 'C']
 

Итак, ‘x1b’, ‘[‘, ‘C’ — это последовательность символов, отправляемых в оболочку с клавиатуры для представления клавиши со стрелкой вправо (курсор вперед).

Я хочу, чтобы эти символы не отображались в оболочке, но курсор будет перемещаться (вперед, назад, к дому, к концу и т. Д. В соответствии с нажатой клавишей).

Обработка после ввода имеет меньшее значение, поскольку основная цель — позволить перемещать курсор!

Как я могу добиться этого в Java?

[ПРАВИТЬ]

Единственная цель — предоставить пользователю точный интерфейс, подобный терминалу, при использовании программы.

Комментарии:

1. Я не уверен, что это может быть достигнуто из самой Java, поскольку нажатия клавиш сначала обрабатываются вашей командной строкой и сопоставляются с этими управляющими символами. Затем Java получит входные данные из оболочки, а не наоборот.

2. @Thomas насколько я знаю, это возможно для c и c , но java я не уверен

3. @Thomas я изучу это, и если я смогу найти решение, я обновлю его здесь

4. @Thomas но приведенная вами ссылка предназначена для C #, но класс Java Console довольно ограничен и не предлагает многого!

5. О да, вы правы. Мой плохой, не проверял это. Я удалю комментарий.

Ответ №1:

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

Но, но мы можем достичь этого и многого другого с помощью C или C.

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

Теперь я мало что знаю о какой-либо такой существующей библиотеке (для Java), поэтому я написал свой собственный код на C и вызвал его из Java с помощью JNI.

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

Вот страница GitHub: https://github.com/Jaysmito101/SeriousConsole

Использовать его очень просто.

Мой код:

 import com.jaysmito.sconsole.SeriousConsole;

import java.nio.file.*;
public class Main{
    public static void main(String[] args) throws Exception{
        SeriousConsole.initConsole(Path.of("").toAbsolutePath().toString()   "/libseriousconsole.so");
        SeriousConsole.print("Enter a String : ");
        String s = SeriousConsole.readLine();
        System.out.println("The String entered is: "   s);
    }
}
 

Для компиляции :

 javac -cp SeriousConsole.jar Main.java
 

Для запуска :

 java -cp .:SeriousConsole.jar Main
 

Вы можете загрузить файл jar и so из ссылки GitHub.

Примечание: эта библиотека предназначена для лучшей версии java.io.Console

Комментарии:

1. Приятно! Это лучше, чем эти? 1 , 2 , 3

2. @rustyx я не знаю, как сравнивать, это зависит от того, кто будет его использовать, но основное отличие заключается в том (будет, поскольку моя библиотека еще не завершена, и я запланировал еще кое-что), что указанные вами библиотеки в основном являются оболочкой gnu readline, но то, что я намерен делать со своимбиблиотека должна иметь a better version of java.io.Console , и под этим я подразумеваю больше способов управления консолью, таких как цветные выходные данные, а также я намерен добавить ncurses и разрешить множество способов управления консолью.