Un BufferedReader è una classe semplice pensata per leggere in modo efficiente dal flusso sottostante. In genere, ogni richiesta di lettura fatta da un Reader come un FileReader fa in modo che una richiesta di lettura corrispondente venga inviata al flusso sottostante. Ogni invocazione di read () o readLine () potrebbe causare la lettura dei byte dal file, la conversione in caratteri e la successiva restituzione, il che può essere molto inefficiente. L'efficienza è notevolmente migliorata se un Reader è deformato in un BufferedReader.
BufferedReader è sincronizzato, quindi le operazioni di lettura su BufferedReader possono essere eseguite in sicurezza da più thread.
Uno scanner d'altra parte ha molto più formaggio incorporato; può fare tutto ciò che può fare un BufferedReader e allo stesso livello di efficienza. Tuttavia, inoltre, uno scanner può analizzare il flusso sottostante per tipi e stringhe primitivi utilizzando espressioni regolari. Può anche tokenizzare il flusso sottostante con il delimitatore di tua scelta. Può anche eseguire la scansione in avanti del flusso sottostante ignorando il delimitatore!
Uno scanner tuttavia non è sicuro per i thread, ma deve essere sincronizzato esternamente.
La scelta di utilizzare un BufferedReader o uno scanner dipende dal codice che si sta scrivendo, se si sta scrivendo un semplice lettore di log Il lettore con buffer è adeguato. Tuttavia, se stai scrivendo un parser XML, Scanner è la scelta più naturale.
Anche durante la lettura dell'input, se si desidera accettare l'input dell'utente riga per riga e dire semplicemente aggiungerlo a un file, un BufferedReader è abbastanza buono. D'altra parte, se si desidera accettare l'input dell'utente come comando con più opzioni e quindi si intende eseguire diverse operazioni in base al comando e alle opzioni specificate, uno scanner si adatterà meglio.