A parte alcune classi particolari (es. File o RandomAccessFile), praticamente tutte le altre classi di I/O nel package java.io sono modellate sul noto design pattern "Decorator". Questo pattern descrive una architettura in cui c'è un tipo base da cui derivano due tipologie di classi: i "componenti" e i "decoratori". I componenti sono classi che fanno un lavoro ben preciso e finito. I decoratori invece sono classi che incapsulano un altro oggetto (un componente o a sua volta un decoratore) al fine di "decorarlo" per aggiungere del comportamento in più a runtime.
In quest'ottica purtroppo vengono tipicamente fuori un gran numero di classi, perché ogni classe è focalizzata generalmente su un solo e unico aspetto. Se cerchi una singola classe che es. legge da file, bufferizza e fornisce "righe" ... NON la trovi.
FileReader è un "componente" (nel pattern Decorator), sa solo leggere caratteri da file, non "incapsula" un altro oggetto di I/O, non sa bufferizzare né fare altro. Mentre BufferedReader è un "decoratore", esso è-un Reader e incapsula un altro Reader (basta vedere i costruttori di BufferedReader). Non sa leggere da file ma sa come bufferizzare l'input e estrarre righe.
Quindi se vuoi leggere da file (usando il charset predefinito) E vuoi bufferizzare potendo leggere anche "a righe", devi istanziare un FileReader, poi incapsularlo in un BufferedReader e usare quest'ultimo.
Una volta che ti è chiaro il concetto del Decorator ... tutto ti apparirà più chiaro e logico.![]()


Rispondi quotando