2011-12-01 28 views
6

Ho bisogno di capire la differenza tra queste due classi e come funzionano l'una con l'altra. Capisco che FileReader legge i caratteri da un file un carattere alla volta e BufferedReader legge una grande porzione di dati e lo memorizza in un buffer e quindi lo rende più veloce.Che cosa si aspetta un costruttore di BufferedReader su FileReader

Per utilizzare un BufferedReader, devo fornire un FileReader. In che modo la classe BufferedReader utilizza FileReader se legge il file in modo diverso? Significa che BufferedReader utilizza FileReader e quindi dietro le quinte i personaggi sono ancora letti un carattere alla volta? Credo che la mia domanda è come la classe BufferedReader utilizza la classe FileReader.

+0

Non dovresti preoccuparti di come funziona. Sappi che lo fa e che è molto probabilmente più efficiente di qualsiasi cosa tu possa inventarti. E se insisti a sapere come funziona in dettaglio, vai avanti e guarda nel codice sorgente. –

risposta

5

Prima di tutto, BufferedReader prende uno Reader, non uno FileReader (sebbene quest'ultimo sia accettato).

La classe astratta Reader ha diversi metodi read(). Esiste una versione di lettura di un personaggio e due versioni che leggono un blocco di caratteri in un array.

È consigliabile utilizzare BufferedReader se si stanno leggendo singoli caratteri o piccoli blocchi alla volta.

considerare le seguenti due richieste:

char ch1 = fileReader.read(); 
char ch2 = bufferedReader.read() 

Il primo andrà al file sottostante, mentre il secondo sarà molto probabilmente soddisfatti dal buffer interno s' il BufferedReader.

2

Un FileReader ha la capacità di leggere blocchi, non solo 1 carattere alla volta. Eredita i metodi read (char []) da Reader in modo da poter leggere fino alla dimensione dell'array char [] passato. BufferedReader semplicemente avvolge FileReader in modo tale che quando si chiamano i metodi read() su BufferedReader, gestisce i buffer internamente e chiama i metodi read() sul Reader sottostante. Uno dei motivi principali per cui utilizzi BufferedReader è che puoi utilizzare il metodo readLine(). Un BufferedReader può racchiudere altri lettori oltre a un FileReader (come InputStreamReader).

+0

Il concetto di BufferedReader 'avvolgimento' di un FileReader è importante. Come menzionato nell'ultima riga, BufferedReader può anche avvolgere altri tipi di Lettori come InputStreamReader ** e ** può anche essere avvolto. Questo è chiamato [Decorator Pattern] (http: //en.wikipedia.org/wiki/Decorator_pattern) Consente di aggiungere funzionalità/comportamenti in modo dinamico a un oggetto. – phuibers

6

BufferedReader utilizza il metodo FileReader.read(char[] cbuf, int off, int len) che è possibile leggere anche se si desidera ottenere più di un carattere alla volta.

BufferedReader semplifica la lettura delle dimensioni desiderate ed è comunque efficiente. Se stai leggendo sempre blocchi di grandi dimensioni, può essere leggermente più efficiente rilasciare BufferedReader.

2

BufferedReader aggiunge uno strato di buffering sopra qualsiasi lettore. Il punto è rendere la lettura più ottimale rispetto alla lettura di un file, socket o qualcosa in un modo senza buffer. Aggiunge anche alcuni metodi convenienti che non funzionerebbero molto bene a meno che non prefetch un chunk per te. Nel caso FileReader, devi leggere una porzione di dati finché non trovi un \ n 'per poter fare qualcosa come BufferedReader.readLine() e poi dovresti conservare il resto dei dati per la successiva operazione di lettura (per non parlare del lavoro necessario quando devi aspettare una sorgente di dati lenta per consegnartelo tutto).

Problemi correlati