176 votes

Java : Comment obtenir une entrée de System.console()

J'essaie d'utiliser la classe Console pour obtenir des données de l'utilisateur, mais un objet nul est renvoyé lorsque j'appelle la classe Console. System.console() . Dois-je modifier quelque chose avant d'utiliser System.console ?

Console co=System.console();
System.out.println(co);
try{
    String s=co.readLine();
}

1 votes

Est-ce que c'est pour Android ? (je devine d'après votre nom d'utilisateur)

0 votes

Utilisez-vous eclipse pour démarrer votre programme ? Essayez de lancer votre programme sans eclipse en utilisant java.exe.

5 votes

Jetez un coup d'œil au projet de McDowell "AbstractingTheJavaConsole" : illegalargumentexception.googlecode.com/svn/trunk/code/java/

255voto

athspk Points 3073

Utilisation de la console pour lire les entrées (utilisable uniquement en dehors d'un IDE) :

System.out.print("Enter something:");
String input = System.console().readLine();

Un autre moyen (qui fonctionne partout) :

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Test {
    public static void main(String[] args) throws IOException { 
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        System.out.print("Enter String");
        String s = br.readLine();
        System.out.print("Enter Integer:");
        try {
            int i = Integer.parseInt(br.readLine());
        } catch(NumberFormatException nfe) {
            System.err.println("Invalid Format!");
        }
    }
}

System.console() renvoie null dans un IDE.
Donc si vous avez vraiment besoin d'utiliser System.console() lisez ceci solution de McDowell .

0 votes

Pourquoi avons-nous besoin de BufferedReader pour lire l'entrée ? Pourquoi ne pouvons-nous pas lire directement à partir de InputStreamReader ?

4 votes

J'ai la réponse : Avec un BufferedInputStream, la méthode délègue à une méthode read() surchargée qui lit 8192 octets et les met en mémoire tampon jusqu'à ce qu'ils soient nécessaires. Elle ne renvoie toujours que le seul octet (mais garde les autres en réserve). De cette façon, le BufferedInputStream fait moins d'appels natifs au système d'exploitation pour lire le fichier. Merci

0 votes

Dans le cas où nous voulons lire le mot de passe de l'utilisateur, stackoverflow.com/questions/22545603/ masque la ligne avec un astérisque.

120voto

Scanner in = new Scanner(System.in);

int i = in.nextInt();
String s = in.next();

4 votes

Cependant nextLine() est très difficile à manier. Au mieux, il vous donnera mal à la tête si vous essayez d'obtenir des lignes entières de la console.

9 votes

@Yokhen pouvez-vous s'il vous plaît donner un exemple où in.nextLine() créerait des problèmes ?

2 votes

(1) Par défaut, le délimiteur du Scanner est l'espace, donc lorsque l'utilisateur saisit plusieurs textes, le logiciel passera à la fonction next() et la logique de notre logiciel sera erronée. (2) Si j'utilise nextLine() pour lire l'intégralité d'une phrase, y compris les espaces et les symboles \n\r J'ai besoin de trim() l'entrée de l'utilisateur. (3) next() attendra l'entrée de l'utilisateur mais pas nextLine(). (4) J'ai testé useDelimiter(" \\r\\n "), mais cela entraîne une nouvelle erreur dans la logique next() de notre logiciel situé ailleurs. Conclusion, il est en effet assez désordonné d'utiliser Scanner pour lire l'entrée utilisateur. BufferedReader est la meilleure solution.

36voto

lilhore Points 18

Il existe plusieurs façons de lire la chaîne de caractères d'entrée de votre console/clavier. L'exemple de code suivant montre comment lire une chaîne de caractères depuis la console/le clavier en utilisant Java.

public class ConsoleReadingDemo {

public static void main(String[] args) {

    // ====
    BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
    System.out.print("Please enter user name : ");
    String username = null;
    try {
        username = reader.readLine();
    } catch (IOException e) {
        e.printStackTrace();
    }
    System.out.println("You entered : " + username);

    // ===== In Java 5, Java.util,Scanner is used for this purpose.
    Scanner in = new Scanner(System.in);
    System.out.print("Please enter user name : ");
    username = in.nextLine();      
    System.out.println("You entered : " + username);

    // ====== Java 6
    Console console = System.console();
    username = console.readLine("Please enter user name : ");   
    System.out.println("You entered : " + username);

}
}

La dernière partie du code utilisé java.io.Console vous ne pouvez pas obtenir l'instance de Console à partir de la classe System.console() lors de l'exécution du code de démonstration via Eclipse. Parce qu'Eclipse exécute votre application en tant que processus d'arrière-plan et non en tant que processus de niveau supérieur avec une console système.

18voto

Jon Skeet Points 692016

Cela dépendra de votre environnement. Si vous exécutez une interface utilisateur Swing par l'intermédiaire de javaw par exemple, alors il y a n'est pas une console à afficher. Si vous travaillez dans un IDE, cela dépendra de la façon dont l'IDE gère les entrées/sorties de la console.

En ligne de commande, tout devrait bien se passer. Un échantillon :

import java.io.Console;

public class Test {

    public static void main(String[] args) throws Exception {
        Console console = System.console();
        if (console == null) {
            System.out.println("Unable to fetch console");
            return;
        }
        String line = console.readLine();
        console.printf("I saw this line: %s", line);
    }
}

Exécutez ceci juste avec java :

> javac Test.java
> java Test
Foo  <---- entered by the user
I saw this line: Foo    <---- program output

Une autre option consiste à utiliser System.in que vous voudrez peut-être envelopper d'un BufferedReader pour lire les lignes, ou utiliser Scanner (encore un emballage System.in ).

7voto

vas Points 24

J'ai trouvé de bonnes réponses ici concernant la lecture de la console, voici une autre façon d'utiliser le 'Scanner' pour lire la console :

import java.util.Scanner;
String data;

Scanner scanInput = new Scanner(System.in);
data= scanInput.nextLine();

scanInput.close();            
System.out.println(data);

1 votes

Vous ne voulez peut-être pas appeler close() l'analyseur dans ce cas, car il fermera System.in et empêchera votre application de le lire plus tard. (La lecture ultérieure provoque l'erreur "no line found").

0 votes

Oui, je suis d'accord avec cela, close() ne devrait pas être utilisé si l'intention est d'utiliser System.in plus tard dans le programme.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X