Domanda

Sto utilizzando lo snippet di codice riportato di seguito, tuttavia non funziona come dovrebbe.

public static void main(String[] args) {
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

    String line;
    try {
        line = br.readLine();
        while(line != null) {
            System.out.println(line);
            line = br.readLine();
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
}

Dalla lettura del Javadoc su readLine() dice:

Legge una riga di testo.Una riga è considerata terminata da uno qualsiasi dei comandi di avanzamento riga (\n), un ritorno a capo (\r) o un ritorno a capo seguito immediatamente da un avanzamento riga.

ritorna:UN String contenente il contenuto della riga, esclusi i caratteri di terminazione della riga, oppure null se è stata raggiunta la fine del flusso

Lancia: IOException - Se si verifica un errore I/O

Da quanto ho capito, readLine dovrebbe restituire null la prima volta che non viene inserito alcun input diverso dalla terminazione di linea, come \r.Tuttavia, questo codice finisce per ripetersi all'infinito.Dopo il debug, ho scoperto che invece di restituire null quando viene inserito solo un carattere di terminazione, in realtà restituisce una stringa vuota ("").Questo non ha senso per me.Cosa non ho capito bene?

È stato utile?

Soluzione

Da quanto ho capito, readLine dovrebbe restituire null la prima volta che non viene immesso alcun input diverso da una terminazione di riga, come " ".

Questo non è corretto. readLine sarà di ritorno null se viene raggiunta la fine del flusso.Cioè, ad esempio, se stai leggendo un file e il file termina, o se stai leggendo da un socket e il socket si chiude.

Ma se stai semplicemente leggendo l'input della console, premere il tasto Invio sulla tastiera non costituisce la fine dello streaming.È semplicemente un carattere che viene restituito (\n O \r\n a seconda del sistema operativo).

Quindi, se vuoi interrompere sia la stringa vuota che la fine della riga, dovresti fare:

while (line != null && !line.equals(""))

Inoltre, il tuo programma attuale dovrebbe funzionare come previsto se inserisci alcuni file direttamente al suo interno, in questo modo:

java -cp . Echo < test.txt

Altri suggerimenti

Nessun input non equivale alla fine dello stream.Di solito è possibile simulare la fine dello streaming in una console premendo Ctrl+D (Per quanto ne so, alcuni sistemi utilizzano Ctrl+Z Invece).Ma immagino che questo non sia quello che vuoi, quindi è meglio testare le stringhe vuote oltre alle stringhe nulle.

Ce n'è uno carino apache commons lang libreria che ha una buona API per azioni comuni :).Potresti utilizzare l'importazione statica di StringUtils e utilizzare il suo metodo isNotEmpty(String ) per ottenere:

while(isNotEmpty(line)) {
    System.out.println(line);
    line = br.readLine();
}

Potrebbe essere utile un giorno :) Ci sono anche altre classi utili in questa libreria.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top