Stream ingresso/uscita

di il
10 risposte

Stream ingresso/uscita

Ciao a tutti, sono nuovo; vorrei chiedere una cosa sugli stream in Java.

Mi è capitato di usare il seguente codice:
BufferedReader br = new BufferedReader(new InputstreamReader(System.in));
per far leggere un valore da tastiera.

Nel mio caso faccio una domanda a video e faccio leggere un valore da tastiera e così via per diverse volte; il problema è che così facendo mi chiede il primo valore, io lo inserisco e poi mi appaiono tutte le successive domande fino all'ultima senza poter inserire i valori: cioè non aspetta che io scriva qualcosa. Vedo che invece usando il comando:
Scanner sc = new Scanner(System.in);
funziona a dovere, o almeno così sembra.

Qualcuno potrebbe chiarirmi il motivo? Ed eventualmente come dovrei agire se volessi usare il BufferedReader?

Grazie infinite.

10 Risposte

  • Re: Stream ingresso/uscita

    Lo Scanner è stato inserito "da poco", e non fà altro che usare il buffered reader per leggere da tastiera.

    Perchèp dovresti usare il bufferedReader se lo scanner funziona bene?
  • Re: Stream ingresso/uscita

    Ciao, il mio problema non è tanto perchè usare l'uno piuttosto dell'altro, ma sapere perchè uno funziona e l'altro no: cioè conoscere il loro funzionamento; altrimenti devo andare ogni volta a tentoni facendo prove su prove...... non mi sembra molto simpatico come metodo.
  • Re: Stream ingresso/uscita

    Allora, in linea generale, sappi che la classe scanner è stata inserita dalla release 1.5 di java, ed è usata per semplificare, tra le altre cose, la comunicazione con l'utente, come nel tuo caso, senza andare a scomodare i buffer.

    Se vai sulle API e ti cerchi la classe scanner vedi che fà tante cose che ti semplificano notevolmente la vita.

    esattamente qui: http://docs.oracle.com/javase/6/docs/api
  • Re: Stream ingresso/uscita

    Grazie mille per l'aiuto.
  • Re: Stream ingresso/uscita

    Ah, se ci fosse qulcuno che avesse spiegazioni diciamo "terra terra" che mi aiutino a capire meglio, benvengano, visto che non sono un programmatore e faccio un po' di fatica a capire le varie guide online.
  • Re: Stream ingresso/uscita

    Puoi utilizzare un BufferedReader per leggere da tastiera attraverso queste istruzioni:
    
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    String line = br.readLine();
    In cui la prima istruzione crea il reader e la seconda legge effettivamente una riga da tastiera.
    L'unica cosa è che il metodo readLine può lanciare un'eccezione che va gestita, ed è questo forse il tuo problema.
    La classe Scanner, invece, gestisce automaticamente le eccezioni, quindi risulta più semplice da utilizzare. Se non hai esperienza sicuramente ti consiglio di utilizzare uno Scanner piuttosto che un Reader o un InputStream.
  • Re: Stream ingresso/uscita

    Grazie mille per l'aiuto.
    Una domanda: ma se volessi chiedere e leggere dei numeri reali da tastiera non basta usare una cosa come la seguente?
    double valore1, valore2;
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    System.out.println("Primo valore?"); valore1=in.read();
    System.out.println("Secondo valore?"); valore2=in.read();
    e gestire il main() così:
    public static void main(String[] args)throws IOException
    Io scrivo questa cosa, però (dopo la richiesta del secondo operando c'è un'altra domanda che chiede l'operazione da svolgere) dopo aver inserito il primo valore va subito a chiedermi l'operazione da fare.....

    Sapresti aiutarmi?
  • Re: Stream ingresso/uscita

    Il metodo read di BufferedReader legge un singolo carattere e restituisce un intero, ovvero la codifica unicode di quel carattere letto. Quindi non è l'ideale. Potresti, ad esempio fare così:
    double valore1,valore2;
    		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    		System.out.println("Primo valore?"); valore1=Double.parseDouble(br.readLine());
    		System.out.println("Secondo valore?"); valore2=Double.parseDouble(br.readLine());
    		System.out.println("Ho letto: "+valore1+" "+valore2);
    Dovresti, però, stare attento a gestire il caso in cui l'utente non inserisca un numero. In questo caso il metodo parseDouble lancia un NumberFormatException.

    Comunque il pezzo di programma che avevi scritto prima non dovrebbe proprio funzionare, poiché tu chiami "br" il BufferedReader mentre poi fai "in.read()".
  • Re: Stream ingresso/uscita

    Sì, ovviamente mi sono sbagliato...... copia/incolla......... era "br" e non "in".
    Quello che ho notato è che (al di là delle giuste correzioni sull'uso del parse) se facco come dico io e cioè:
    double valore1, valore2, valore3;
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    System.out.println("Primo valore?"); valore1=br.read();
    System.out.println("Secondo valore?"); valore2=br.read();
    System.out.println("Terzoo valore?"); valore3=br.read();
    Mi salta dalla prima alla terza domanda perchè mi prende da tastiera il valore ottenuto premendo il tasto "Invio".......
  • Re: Stream ingresso/uscita

    Il motivo è semplice. Attraverso il metodo "read" si legge un carattere alla volta. Se tu alla prima domanda passi una stringa composta da più di un carattere, le successive "read" non aspettano che tu inserisca qualcosa da tastiera perché il buffer di lettura è già pieno. Tieni conto che premendo invio viene inserito il carattere di newline (\n) che corrisponde al valore esadecimale "A". Quindi se alla prima domanda inserisci la stringa "ciao", la prima "read" leggerà il carattere "c" (in hex è 0x63), la seconda "i" (0x69), la terza "a" (0x61), la quarta "o" (0x6F) e la quinta il carattere "INVIO" (ovvero 0xA, come accennato prima). Per verificare, puoi fare una System.out.println(valore1+" "+valore2+" "+valore3). Nota che i valori stampati sono in decimale, quindi avrai nell'ordine: 99, 105, 97, 111, 10.
Devi accedere o registrarti per scrivere nel forum
10 risposte