Visualizzazione dei risultati da 1 a 7 su 7
  1. #1
    Utente di HTML.it
    Registrato dal
    May 2008
    Messaggi
    142

    [JAVA] Problema buffered reader

    Ciao a tutti,

    utilizzo un buffered reader per leggerere dei dati da seriale notando un comportamento "strano" (almeno io non lo capisco )

    Vorrei utilizzare il metodo ready per capire se posso leggere o meno il buffered reader, ma mi capita ( non è un comportamento fisso) che il ready mi restituisca un valore false ma se leggo una sua linea con il metodo readLine questa sia valorizzata.


    codice:
            
    InputStream in;
    InputStreamReader isr ;
    ....
    
    BufferedReader  br = new BufferedReader (isr);
                 System.out.println (br.ready);    <<<-- FALSE  
                 System.out.println (br.readLine());  <<<-- RIGA LETTA  
    
                            if (br.ready())
                            {
                                    if ((stringa  = br.readLine()) != null)
                                    {
                                      .......
                                     }
                              }
                              else {
                                   System.out.println ( "Niente dati");
                                   System.out.println (br.readLine()); <<<<----
                              }
    ho frainteso qualcosa?

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: [JAVA] Problema buffered reader

    Originariamente inviato da som
    Vorrei utilizzare il metodo ready
    Generalmente no, non si usa. L'approccio "tipico" è:

    codice:
    String linea;
    
    while ((linea = br.readLine()) != null) {
        // .... usa linea ....
    }
    Tutto qui.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Utente di HTML.it
    Registrato dal
    May 2008
    Messaggi
    142
    Grazie andbin.

    E' quello che avevo fatto prima.. ma mi sono accorto che non aveva il comportamento che mi aspettavo.

    Se ad esempio stacco la sorgente di dati dalla seriale il codice rimane in attesa.. la readLine non sembra restituirmi un "null".

  4. #4
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,315
    Non mi sembra una buona soluzione usare un BufferedReader per leggere da una seriale... considerando che i dati nella seriale sono tutt'altro che bufferizzati.

    Crea un buffer (array di byte) sufficientemente grande e leggi usando direttamente la read() dell'InputStream, tenendo presente che i dati possono arrivare "ad intervalli".


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  5. #5
    Utente di HTML.it
    Registrato dal
    May 2008
    Messaggi
    142
    Ciao, il protocollo è a righe e mi era stato suggerito il buffered reader da andbin ( http://forum.html.it/forum/showthrea...readid=1363315 )

    Infatti funziona abbastanza bene, solo che nel caso in cui non arrivi niente sulla seriale non riesco ad "accorgemene" perchè la readLine rimane in attesa. :master:

  6. #6
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,315
    Non ho fatto molte prove con le seriali (e in quelle che ho fatto ho usato l'InputStream direttamente), ma usare un BufferedReader ha senso se i dati che vengono trasmessi dalla seriale sono completi. Ovvero, hai un protocollo a righe e ciascuna riga viene trasmessa per intero (sempre terminata da un separatore di linea).

    Se tu, al contrario, stacchi la seriale in modo arbitrario, lei potrebbe aver inviato alla porta solo una porzione dei dati (quindi, senza il delimitatore di linea e senza nessun terminatore di dati [EOF]).

    In questo caso credo che il buffer del BufferedReader venga riempito solo parzialmente. Il BufferedReader a questo punto attende nuovi dati che non arrivano.

    BufferedReader va benissimo quando si leggono file testuali (ciascuna riga è delimitata e alla fine del file si incontra sempre un EOF); andrebbe benissimo anche per la lettura da seriale se ci fosse la sicurezza che i dati sono sempre completi. Ma in questo particolare caso non credo sia così semplice gestire tramite BufferedReader.

    Potresti provare ad appoggiare il test del while() anche al metodo available() del InputStream iniziale... ma dubito che risolveresti.

    E' un po' quello che accade quando istanzi un BufferedReade per leggere i dati dalla tastiera... la readLine() attende che tu prema INVIO (separatore di linea) o che tu invii un EOF (fine dei dati).

    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  7. #7
    Utente di HTML.it
    Registrato dal
    May 2008
    Messaggi
    142
    Grazie LeleFT per la spiegazione.

    Hai inquadrato esattamente il problema. Anche con il metodo available non credo di ruiscire a risolvere. Quando il ready del bufferedReader è false l'available è 0.

    Molto probabilmente lascio perdere questo controllo.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.