Verwenden Sie JLine, wenn Sie Tastenanschläge auf der Konsole zeichenweise in Java verarbeiten möchten

Überblick

Dieser Eintrag befasst sich mit der zeichenweisen Eingabe, wenn Sie ein Programm schreiben, das auf der Konsoleneingabe / -ausgabe in Java ausgeführt wird.

Hintergrund

In Java gibt es Streams, die Standard-E / A verarbeiten, aber Sie können die Eingabe zeichenweise "lesen", aber Sie können Tastendruckereignisse nicht direkt verarbeiten.

Aus diesem Grund wird beispielsweise beim Erstellen eines "Computer" -Programms, wenn Sie "+" drücken, sofort etwas getan, was mit der Standardbibliothek allein nicht erreicht werden kann.

Verwenden Sie JLine

Was ist JLine?

JLine3 ist eine Bibliothek, die bei der Entwicklung von CUI-Anwendungen verwendet werden kann. Es wird auch in einigen bekannten OSS verwendet.

JLine3 unterstützt auch die plattformspezifische Terminalsteuerung in einer Windows-Umgebung. Da hier eine plattformeigene Bibliothek erforderlich ist, wird eine Methode mit JNA oder JANSI bereitgestellt. Dieser Eintrag verwendet JNA.

Codebeispiel

Wenn Sie den folgenden Code verwenden, können Sie jedes Zeichen über das Terminal eingeben und sofort in der Standardausgabe anzeigen.

package com.hrkt.commandlinecalculator;

import lombok.extern.slf4j.Slf4j;
import org.jline.terminal.Terminal;
import org.jline.terminal.TerminalBuilder;
import org.springframework.stereotype.Component;

import java.io.IOException;

@Component
@Slf4j
public class CommandlineInterface {
    public void run(String... args) {
        log.info("hello");

        try(Terminal terminal = TerminalBuilder.terminal()) {
            int ch = 0;
            while ((ch = terminal.reader().read()) != 0x09){
                // TAB(0x09)Beenden Sie mit
                char c = (char)ch;
                System.out.println(String.format("%d, %c", ch, ch));
            }
        } catch(IOException e) {
            log.error(e.getMessage(), e);
        }
    }
}

Die Bewegung ist wie in der folgenden Abbildung gezeigt.

char-by-char.png

abschließend

Dieser Eintrag zeigte Ihnen, wie Sie mit Tastenanschlägen von der Konsole in Java umgehen. Ich sehe Artikel, die JLine2 verwenden, aber es wurde entwickelt und es wird empfohlen, JLine3 zu verwenden.

Codebeispiel

Ein Arbeitsbeispiel finden Sie unten.

https://github.com/hrkt/commandline-calculator/releases/tag/0.0.2

Recommended Posts

Verwenden Sie JLine, wenn Sie Tastenanschläge auf der Konsole zeichenweise in Java verarbeiten möchten
Wenn Sie die Methode außerhalb verwenden möchten
Das erste, was Sie tun müssen, wenn Sie mit Heroku auf GitHub mit Eclipse auf Java zufrieden sein möchten
Wenn Sie Annotation in Java 8 dynamisch ersetzen möchten
# 1_JAVA Ich möchte die Indexnummer durch Angabe eines Zeichens in der Zeichenfolge erhalten
Code, der verwendet werden soll, wenn Sie Json nur mit Standardbibliotheken in Java verarbeiten möchten
Wenn Sie die Hauptzweiginformationen in dem aktuellen Zweig wiedergeben möchten, an dem Sie gerade arbeiten
Ich möchte die IP-Adresse erhalten, wenn ich mit Java eine Verbindung zu Wi-Fi herstelle
[RSpec] Wenn Sie die Instanzvariable des Controllers im Test verwenden möchten [Zuweisungen wird nicht empfohlen]
Wenn Sie InputStream in JDBI3 binden möchten
Ein Hinweis, wenn Sie Tupel in Java möchten
[Swift] Verwenden Sie nonzeroBitCount, wenn Sie in Swift popcnt möchten
Ich möchte, dass Sie Scala vorerst als besseres Java verwenden
Ich möchte ES2015 auch in Java verwenden! → (´ ・ ω ・ `)
Hinweise zur Verwendung regulärer Ausdrücke in Java
[Android Studio] Ich möchte Einschränkungen für die in EditText [Java] registrierten Werte festlegen.
Zusammenfassung der Verwendung des im IE festgelegten Proxy-Sets bei der Verbindung mit Java
[Java-Tool] Ein nützliches Tool, wenn Sie das IPMSG-Protokoll von PC-A regelmäßig an den angegebenen PC senden möchten.
Ich möchte Java Applet einfach in der Befehlszeile verwenden, ohne IDE zu verwenden
Dinge, die Sie häufig bei der Webentwicklung mit Java verwenden
Ich möchte die Java 8 DateTime-API (jetzt) langsam verwenden.
Wenn Sie Java-Bibliothekstests mit Spock in mehreren Modulen mit Gradle in Android Studio 3 implementieren möchten
So wechseln Sie Java in der OpenJDK-Ära auf dem Mac
[Java] Verwenden Sie ResolverStyle.LENIENT, um Datum und Uhrzeit gut zu handhaben
Delicate ist praktisch, wenn Sie Teile wiederverwenden möchten
Ich möchte die if-else-Anweisung für bedingte Verzweigungen in Java vereinfachen
Eingabe in die Java-Konsole
[Swift] Wenn Sie wissen möchten, ob die Anzahl der Zeichen in String mit einer bestimmten Anzahl übereinstimmt ...
Ich möchte die Notwendigkeit des Testens beurteilen, indem ich die Unterschiede der Klassendateien beim Refactoring von Java vergleiche.
Vergleich von Versionszeichenfolgen, wenn Sie die Verarbeitung zwischen zwei Versionen verzweigen möchten (Java-Implementierung)
Ein Memorandum, wenn Sie die von Jena & SPARQL erfassten Daten für jede Variable anzeigen möchten.
Wie schreibe ich, wenn ich mit "C language string array" wie argv [] in Ruby-FFI umgehen möchte?
Was tun, wenn Sie die Quellposition wissen möchten, an der die Methode in bind.pry definiert ist?
Wenn Sie eine Methode in RSpec verspotten möchten, sollten Sie die Methode allow für mock und die Singleton-Methode verwenden.
Wenn die von JNA an C ++ übergebene Zeichenfolge verstümmelt ist
ProxyFactory ist praktisch, wenn Sie AOP mit Spring testen möchten!
Wenn Sie die Java-Entwicklungsumgebung von Eclipse aus ändern möchten
[Java] Ich möchte mit dem Schlüssel im Objekt eindeutig arbeiten
So beheben Sie den unbekannten Fehler, der bei der Verwendung von slf4j in Java aufgetreten ist
Ich habe versucht, den Kalender mit Java auf der Eclipse-Konsole anzuzeigen.
Üben Sie die Verwendung, wenn Sie verschiedene Verarbeitungsgruppen seriell ausführen möchten
Errate den Zeichencode in Java
Wie verwende ich Klassen in Java?
Verwenden Sie Stream in Java?
Es wurde ein Fehler behoben, der beim Versuch auftrat, Spark in einer Umgebung zu verwenden, in der Java 8 und Java 11 gleichzeitig vorhanden sind
[Ruby] Ich möchte nur das ungerade Zeichen in der Zeichenfolge ausgeben
Ein Memo, wenn Sie den Zeitteil des Kalenders löschen möchten
[Java] Zeigt die Bitfolge an, die in der Bytetypvariablen auf der Konsole gespeichert ist
Zusammenfassung der Mittel, wenn Sie mit HTTP unter Android kommunizieren möchten
Was war keine faire Verwendung der Java-API-Umleitung unter Android?
So ermitteln Sie die Gesamtzahl der Seiten beim Paging in Java
Ich möchte bei der Registrierung in der Datenbank eine Fehlermeldung anzeigen
So debuggen Sie die Verarbeitung im Ruby on Rails-Modell nur mit der Konsole
Ihnen, denen im Feld "Keine Stream-API verwenden" mitgeteilt wurde
[Java Spring MVC] Ich möchte DI in meiner eigenen Klasse verwenden