#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
и разрешить множество способов управления консолью.