Salve, vorrei fare chiarezza a proposito dei metodi di input da tastiera, in particolare System.in.read() che ha un comportamento anomalo sul quale ho potuto soltanto fare ipotesi...
Ho questa semplice classe che mi chiede di indovinare una lettera (q nel caso):
Siccome la pressione di INVIO produce due escape, ho bisogno di un do/while "inner" per evitare che, non essendo l'escape == q, mi ristampi il print tre volte (una per la lettera digitata, due per gli escape).codice:class InRead { public static void main(String args[]) throws java.io.IOException { char ch; do { System.out.print("Premi un tasto seguito da INVIO: "); do { ch = (char) System.in.read(); } while(ch == '\n' | ch == '\r'); } while(ch != 'q'); } }
Funziona, ma mi chiedo come!
Spiego le mie perplessità. Immaginiamo di digitare f e poi INVIO. InRead che fa? Analizza f, vede che non è \n né \r, esce dal do/while "inner" e passa al do/while esterno, dove, non verificando la condizione, torna a stampare il print! Quando analizza \n e \r?
Ho avanzato l'ipotesi che l'immissione dell'input avvenga in modalità LIFO, per cui ci dovrebbe essere un buffer che inizi a "svuotarsi" processando i dati dall'ultimo inserito (INVIO coi suoi escape) tenendo per ultima la f. E' così?