Il modo migliore per chiedere input?

2

Mi chiedo quale sia il modo migliore per andare con il codice java. Ho bisogno di creare una classe con semplici prompt per l'input. Ho provato ad utilizzare entrambe le classi e non riesco a trovare i benefici particolari per ciascuna. È perché sono ancora nelle prime fasi della programmazione o ci sono situazioni che si verificano man mano che diventano più complesse?

import java.util.Scanner;

public class myClass
{
    Scanner stdin = new Scanner(System.in);

    public String getInput(String prompt)  
    {
        System.out.print(prompt);
        return stdin.nextLine();
    }

}

... o

import java.io.*;

public class myClass
{
    public static void main(String[] args) throws IOException
    {
        BufferedReader stdin = new BufferedReader(new InputStreamReader(System.in));
        System.out.print("Input something: ");
        String name = stdin.readLine();
    }
}

So che questi esempi mostrano metodi diversi all'interno di queste classi, ma pensavo che questo potesse servire per la discussione.

Non sono sicuro di quale sito sia il migliore per chiederlo.

    
posta Yvette Colomb 22.10.2013 - 11:18
fonte

2 risposte

1

Sono stato un programmatore Java per 6 anni e raramente mi devo preoccupare di come leggere l'input dalla riga di comando. La maggior parte delle volte, quando ho a che fare con input e output, di solito sono flussi di qualche tipo e quindi usare BufferedReader è generalmente una best practice, dato che elimina il collo di bottiglia dal dover leggere un file riga per riga.

Tuttavia, per quello che stai facendo, usare System.in con Scanner è perfettamente a posto. Diciamo solo che se volessi gestire grandi quantità di input, forse avrei avvolto System.in con BufferedInputStream per l'efficienza, ma se il tuo programma è in attesa su tu , allora non c'è alcun vantaggio guadagnato.

    
risposta data 22.10.2013 - 11:56
fonte
2

Semplicemente leggendo System.in con BufferedReader, si finisce per scrivere poche righe di codice di codice di attivazione.

Spostandoti su Scanner, come suggerito nella risposta di Neil, è più facile estrarre i dati di vario tipo dallo stream.

Personalmente, quando un'interfaccia a linea di comando è davvero la scelta migliore (che include ogni volta che è un requisito dichiarato), mi piace usare System.Console () . Non è sempre disponibile (ad esempio, quando si esegue all'interno di alcuni IDE), ma quando lo è, offre cose utili come readPassword () che impedisce che l'input dell'utente venga riportato indietro allo schermo e lo rende così che tu possa leggere da e scrivere sulla console usando lo stesso oggetto. È davvero progettato attorno al tipico caso d'uso per gli strumenti a riga di comando che richiedono l'interazione dell'utente.

L'uso di System.console () non è esplicitamente in conflitto con Scanner:

Console console = System.console();
String name = console.readLine("Please enter your name: ");
Scanner ageScanner = new Scanner(console.readLine("How old are you? ");
int age = ageScanner.nextInt();

Non giocano perfettamente insieme in questo modo, dal momento che devi istanziare un nuovo scanner per ogni linea. La console offre l'accesso a un Reader, che puoi utilizzare per creare un'istanza di uno scanner:

Console console = System.console();
String name = console.readLine("Please enter your name: ");
Scanner consoleScanner = new Scanner(console.reader());
int age = consoleScanner.nextInt();

(Disclaimer: Non ho provato il codice di cui sopra, e non sono esattamente sicuro di come si comportano le cose se usi console.readLine () mescolato con gli usi di uno Scanner fatto da console.reader (). Per chiarezza e coerenza, potrebbe essere saggio scegliere un metodo e attenersi ad esso.)

Seguendo questo esempio, sarei più propenso a scrivere:

Console console = System.console();
String name = console.readLine("Please enter your name: ");
int age = Integer.parseInt(console.readLine("How old are you? ");

A seconda delle tue esigenze, potresti scoprire che uno, l'altro o entrambi sono più adatti alle tue esigenze. In generale, trovo che Scanner sia più adatto alla lettura di un file con un formato noto, e Console è più adatto all'input dell'utente interattivo, perché lo scanner brilla davvero quando si hanno più token per riga di input. Chiedere a un utente di inserire questo tipo di input in modo interattivo probabilmente non porterà alla migliore esperienza.

JavaDoc: java.io.Console

Domanda correlata: Java: come ottenere input da System.console ()

    
risposta data 23.12.2014 - 04:26
fonte

Leggi altre domande sui tag