Java: come ottenere input da System.console ()


163

Sto cercando di utilizzare la classe Console per ottenere input dall'utente, ma quando richiamo viene restituito un oggetto null System.console(). Devo cambiare qualcosa prima di usare System.console?

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

1
è questo per Android? (Sto indovinando dal tuo ID utente)
Ryan Fernandes il

Stai usando eclipse per avviare il tuo programma? Prova ad avviare il programma senza eclipse utilizzando java.exe.
keuleJ


7
@RyanFernandes In che modo il suo nome è rilevante per la sua domanda?
b1nary.atr0phy,

Risposte:


239

Utilizzo della console per leggere l'input (utilizzabile solo al di fuori di un IDE):

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

Un altro modo (funziona ovunque):

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 () restituisce null in un IDE.
Quindi, se hai davvero bisogno di usare System.console(), leggi questa soluzione da McDowell .


perché abbiamo bisogno di BufferedReader per leggere l'input perché non possiamo leggere direttamente da InputStreamReader
Learner

2
Ho ottenuto la risposta: con BufferedInputStream, il metodo delega a un metodo read () sovraccarico che legge 8192 quantità di byte e li bufferizza fino a quando non sono necessari. Restituisce comunque solo il singolo byte (ma mantiene gli altri in riserva). In questo modo BufferedInputStream effettua meno chiamate native al sistema operativo per leggere dal file. Grazie
Principiante

Nel caso in cui desideriamo leggere la password dell'utente, stackoverflow.com/questions/22545603/… maschera la riga con l'asterisco.
oraclesoon,

@Learner un altro motivo potrebbe essere che BufferedReader fornisce il metodo per readLine()cui non esiste InputStreamReader.
Marcono1234,

116
Scanner in = new Scanner(System.in);

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

4
Tuttavia nextLine()è molto complicato lavorare con. Nella migliore delle ipotesi ti farà venire il mal di testa quando cerchi di ottenere intere linee dalla console.
Yokhen,

9
@Yokhen potresti per favore dare un esempio in cui in.nextLine()creerebbe problemi?
giovedì

2
(1) Per impostazione predefinita, il delimitatore di Scanner è spazio, quindi quando l'utente immette più testi, il software passerà ai prossimi () e la logica nel nostro software sarà errata. (2) Se uso nextLine () per leggere l'intera frase completa che include lo spazio e \ n \ r, devo tagliare l'input dell'utente (). (3) next () attenderà l'input dell'utente, ma nextLine () no. (4) Ho testato useDelimiter ("\\ r \\ n"), ma fa sì che la logica next () nel nostro software da qualche altra parte sia nuovamente sbagliata. In conclusione, è davvero piuttosto complicato utilizzare Scanner per leggere l'input dell'utente. BufferedReader è il migliore.
oraclesoon

Ho anche problemi con lo scanner, in particolare ne ottengo uno java.util.NoSuchElementExceptionche non capisco bene.
Romain Vincent,

Tutto questo dovrebbe essere all'interno di una prova con risorse e il metodo dovrebbe essere in.nextLine () se si desidera leggere una riga.
Calabacin,

35

Esistono alcuni modi per leggere la stringa di input dalla tua console / tastiera. Il seguente codice di esempio mostra come leggere una stringa dalla console / tastiera utilizzando 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);

}
}

L'ultima parte del codice ha utilizzato la java.io.Consoleclasse. non è possibile ottenere l'istanza della console da System.console()quando si esegue il codice demo tramite Eclipse. Perché eclipse esegue l'applicazione come processo in background e non come processo di livello superiore con una console di sistema.


18

Dipenderà dal tuo ambiente. Se ad esempio stai eseguendo un'interfaccia utente Swing javaw, non c'è una console da visualizzare. Se stai eseguendo un IDE, dipenderà molto dalla gestione dell'IO della console da parte dell'IDE specifico.

Dalla riga di comando, dovrebbe andare bene però. Campione:

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);
    }
}

Esegui solo con java:

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

Un'altra opzione è quella di usare System.in, che potresti voler racchiudere in a BufferedReaderper leggere le righe, o usare Scanner(di nuovo a capo System.in).


7

Ho trovato una buona risposta qui per quanto riguarda la lettura dalla console, qui un altro modo usa 'Scanner' per leggere dalla console:

import java.util.Scanner;
String data;

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

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

1
In close()questo caso potresti non voler chiamare lo scanner, perché chiuderà System.in e impedirà alla tua applicazione di leggerlo in seguito. (La lettura successiva genera l'errore "nessuna riga trovata")
Trevor

Sì, sono d'accordo, close () non dovrebbe essere usato se l'intenzione è quella di utilizzare System.in più avanti nel programma.
akhouri,

5

Prova questo. spero che questo possa aiutare.

    String cls0;
    String cls1;

    Scanner in = new Scanner(System.in);  
    System.out.println("Enter a string");  
    cls0 = in.nextLine();  

    System.out.println("Enter a string");  
    cls1 = in.nextLine(); 

3

Quanto segue prende la risposta di athspk e la trasforma in una che gira continuamente fino a quando l'utente digita "esci". Ho anche scritto una risposta di follow-up in cui ho preso questo codice e l'ho reso testabile.

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

public class LoopingConsoleInputExample {

   public static final String EXIT_COMMAND = "exit";

   public static void main(final String[] args) throws IOException {
      BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
      System.out.println("Enter some text, or '" + EXIT_COMMAND + "' to quit");

      while (true) {

         System.out.print("> ");
         String input = br.readLine();
         System.out.println(input);

         if (input.length() == EXIT_COMMAND.length() && input.toLowerCase().equals(EXIT_COMMAND)) {
            System.out.println("Exiting.");
            return;
         }

         System.out.println("...response goes here...");
      }
   }
}

Esempio di output:

Enter some text, or 'exit' to quit
> one
one
...response goes here...
> two
two
...response goes here...
> three
three
...response goes here...
> exit
exit
Exiting.

3

Ho scritto la libreria Text-IO , che può gestire il problema di System.console () essendo null quando si esegue un'applicazione dall'interno di un IDE.

Presenta uno strato di astrazione simile a quello proposto da McDowell . Se System.console () restituisce null, la libreria passa a una console basata su Swing.

Inoltre, Text-IO ha una serie di funzioni utili:

  • supporta la lettura di valori con vari tipi di dati.
  • consente di mascherare l'input durante la lettura di dati sensibili.
  • consente di selezionare un valore da un elenco.
  • consente di specificare vincoli sui valori di input (schemi di formato, intervalli di valori, vincoli di lunghezza ecc.).

Esempio di utilizzo:

TextIO textIO = TextIoFactory.getTextIO();

String user = textIO.newStringInputReader()
        .withDefaultValue("admin")
        .read("Username");

String password = textIO.newStringInputReader()
        .withMinLength(6)
        .withInputMasking(true)
        .read("Password");

int age = textIO.newIntInputReader()
        .withMinVal(13)
        .read("Age");

Month month = textIO.newEnumInputReader(Month.class)
        .read("What month were you born in?");

textIO.getTextTerminal().println("User " + user + " is " + age + " years old, " +
        "was born in " + month + " and has the password " + password + ".");

In questa immagine puoi vedere il codice sopra in esecuzione in una console basata su Swing.


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.