Utilisez JLine lorsque vous souhaitez gérer les frappes sur la console caractère par caractère en Java

Aperçu

Cette entrée explique comment gérer l'entrée caractère par caractère lors de l'écriture d'un programme qui s'exécute sur l'entrée / sortie de la console en Java.

Contexte

En Java, il existe des flux qui gèrent les E / S standard, mais vous pouvez "lire" les entrées caractère par caractère, mais vous ne pouvez pas gérer directement les événements de frappe.

Pour cette raison, par exemple, lors de la création d'un programme "calculatrice", si vous appuyez sur "+", quelque chose sera fait immédiatement, ce qui ne peut être réalisé avec la bibliothèque standard seule.

Utiliser JLine

Qu'est-ce que JLine

JLine3 est une bibliothèque qui peut être utilisée lors du développement d'applications CUI. Il est également utilisé dans certains OSS bien connus.

JLine3 prend également en charge le contrôle de terminal spécifique à la plate-forme dans un environnement Windows. Puisqu'une bibliothèque native de plate-forme est nécessaire ici, une méthode utilisant JNA ou JANSI est fournie. Cette entrée utilise JNA.

Exemple de code

Si vous utilisez le code ci-dessous, vous pouvez saisir chaque caractère depuis le terminal et l'afficher immédiatement dans la sortie standard.

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)Quitter avec
                char c = (char)ch;
                System.out.println(String.format("%d, %c", ch, ch));
            }
        } catch(IOException e) {
            log.error(e.getMessage(), e);
        }
    }
}

Le mouvement est comme illustré dans la figure ci-dessous.

char-by-char.png

en conclusion

Cette entrée vous a montré comment gérer les frappes à partir de la console en Java. Je vois des articles qui utilisent JLine2, mais il a été développé et il est recommandé d'utiliser JLine3.

Exemple de code

Un exemple de travail peut être trouvé ci-dessous.

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

Recommended Posts

Utilisez JLine lorsque vous souhaitez gérer les frappes sur la console caractère par caractère en Java
Lorsque vous souhaitez utiliser la méthode à l'extérieur
La première chose à faire lorsque vous voulez être satisfait d'Heroku sur GitHub avec Eclipse sur Java
Lorsque vous souhaitez remplacer dynamiquement l'annotation dans Java 8
# 1_JAVA Je veux obtenir le numéro d'index en spécifiant un caractère dans la chaîne de caractères
Code à utiliser lorsque vous souhaitez traiter Json en Java avec uniquement des bibliothèques standard
Lorsque vous souhaitez refléter les informations de la branche principale dans la branche actuelle sur laquelle vous travaillez actuellement
Je souhaite obtenir l'adresse IP lors de la connexion au Wi-Fi avec Java
[RSpec] Lorsque vous souhaitez utiliser la variable d'instance du contrôleur dans le test [attribuer n'est pas recommandé]
Lorsque vous souhaitez lier InputStream dans JDBI3
Une note quand vous voulez Tuple en Java
[Swift] Utilisez nonzeroBitCount lorsque vous voulez popcnt dans Swift
Je veux que vous utilisiez Scala comme meilleur Java pour le moment
Je veux aussi utiliser ES2015 avec Java! → (´ ・ ω ・ `)
Remarques sur l'utilisation des expressions régulières en Java
[Android Studio] Je souhaite définir des restrictions sur les valeurs enregistrées dans EditText [Java]
Résumé de l'utilisation du jeu de proxy dans IE lors de la connexion avec Java
[outil java] Un outil utile lorsque vous souhaitez envoyer régulièrement le journal ipmsg de PC-A au PC spécifié.
Je souhaite utiliser l'applet Java facilement sur la ligne de commande sans utiliser l'IDE
Ce que vous utilisez souvent lorsque vous faites du développement Web avec Java
Je souhaite utiliser l'API Java 8 DateTime lentement (maintenant)
Lorsque vous souhaitez implémenter des tests de bibliothèque Java avec Spock en multi-module avec Gradle dans Android Studio 3
Comment changer Java à l'ère d'OpenJDK sur Mac
[Java] Utilisez ResolverStyle.LENIENT pour bien gérer la date et l'heure
Delicate est pratique à utiliser lorsque vous souhaitez réutiliser des pièces
Je souhaite simplifier l'instruction if-else de la branche conditionnelle en Java
Entrée dans la console Java
[Swift] Lorsque vous voulez savoir si le nombre de caractères dans String correspond à un certain nombre ...
Je veux juger de la nécessité de tester en comparant les différences des fichiers de classe lors de la refactorisation de Java.
Comparaison des chaînes de version lorsque vous souhaitez brancher le traitement entre deux versions (implémentation Java)
Un mémorandum lorsque vous souhaitez voir les données acquises par Jena & SPARQL pour chaque variable.
Comment écrire lorsque vous voulez gérer un "tableau de chaînes en langage C" comme argv [] dans Ruby-FFI
Que faire lorsque vous souhaitez connaître la position source où la méthode est définie dans binding.pry
Si vous souhaitez simuler une méthode dans RSpec, vous devez utiliser la méthode allow pour mock et la méthode singleton.
Lorsque la chaîne de caractères transmise au C ++ par JNA est déformée
ProxyFactory est pratique lorsque vous souhaitez tester AOP avec Spring!
Si vous souhaitez modifier l'environnement de développement Java d'Eclipse
[Java] Je veux effectuer distinctement avec la clé dans l'objet
Comment résoudre l'erreur inconnue apparue lors de l'utilisation de slf4j en Java
J'ai essayé d'afficher le calendrier sur la console Eclipse en utilisant Java.
Pratique à utiliser lorsque vous souhaitez exécuter différents groupes de traitement en série
Devinez le code de caractère en Java
Comment utiliser les classes en Java?
Utilisez-vous Stream en Java?
Résolution d'une erreur survenue lors de la tentative d'utilisation de Spark dans un environnement où Java 8 et Java 11 coexistent
[Ruby] Je souhaite afficher uniquement le caractère impair dans la chaîne de caractères
Un mémo lorsque vous souhaitez effacer la partie horaire de l'agenda
[Java] Afficher la chaîne de bits stockée dans la variable de type d'octet sur la console
Résumé des moyens lorsque vous souhaitez communiquer avec HTTP sur Android
Qu'est-ce qui n'était pas une utilisation équitable du détournement d'API Java sur Android?
Comment trouver le nombre total de pages lors de la pagination en Java
Je souhaite afficher un message d'erreur lors de l'inscription dans la base de données
Comment déboguer le traitement dans le modèle Ruby on Rails avec juste la console
À vous à qui on a dit "Ne pas utiliser Stream API" dans le champ
[Java Spring MVC] Je souhaite utiliser DI dans ma propre classe