PDA

Visualizza versione completa : [JAVA] Chiarimento sulla classe BufferedReader


Downloader
23-11-2006, 12.21.56
BufferedReader input = new BufferedReader(new InputStreamReader(System.in));

Allora, vado a dichiarare un oggetto 'input' di tipo 'BufferedReader' (classe che appartiene al package io).

Con 'new' vado a costruire l'oggetto e...nel metodo costruttore che diavolo è tutta quella roba??

Una volta istanziato l'oggetto 'input' di quali metodi potrà disporre?? Solo quelli di BufferedReader o anche quelli di InputStreamReader??


Forse la domanda è un po' sciocca, ma non avendo mai visto l'implemetazione in un costuttore di un'istanza di un nuovo oggetto resto un attimino stordito.


tnx! ;)

Dav82
23-11-2006, 13.12.47
Alùra, senza perdersi in dettagli e dettaglietti (che per altro non ti saprei spiegare, ecco perché evito :D), BufferedReader (http://java.sun.com/j2se/1.5.0/docs/api/java/io/BufferedReader.html) è un buffer (appunto, altrimenti mica lo chiamavano così)... e che cosa bufferizza? Uno stream. Lo stream che viene bufferizzato è quello passato come parametro, ovvero un oggetto di tipo Reader (http://java.sun.com/j2se/1.5.0/docs/api/java/io/Reader.html). Ma su cosa si sincronizza questo Reader? Su cosa si basa? In poche parole: che cosa legge? Legge (e si sincronizza su) l'oggetto che gli viene passato come parametro, ovvero System.in (http://java.sun.com/j2se/1.5.0/docs/api/java/lang/System.html#in), che è nient'altro che l'oggetto che rappresenta l'input standard correntemente specificato nel sistema.

Se guardi nella documentazione, BufferedReader è una sottoclasse di java.io.Reader e, tramite questa, di java.lang.Object, per cui eredita i metodi di queste due classi... nella documentazione sono elencati appunto sotto quelli specifici della classe BufferedReader.


Il creare un oggetto on the fly direttamente nel costruttore di un altro, per usarlo come parametro da passare, è pratica comune, perchè evita di scrivere troppe dichiarazioni e linee di codice, anche se magari complica un po' la dichiarazione stessa... fattoci l'occhio cmq non è un gran problema :)
Ricorda solamente che, nel caso poi ti serva l'oggetto dichiarato on the fly (in questo caso quello di tipo Reader), non potrai usarlo, perchè non hai un riferimento (nome di variabile), a meno che l'oggetto "esterno" (in questo caso il BufferedReader) non fornisca un metodo per referenziarlo... in questo caso dalla documentazione sembra che questo metodo non ci sia (potrebbe essere tipo Reader getReader())
Nel caso il metodo per accedere all'oggetto "nascosto" non ci sia, e a te serva accedere comunque a questo oggetto, puoi spezzare la dichiarazione in più parti, per esempio in questo caso così:

InputStreamReader pippo = new InputStreamReader(System.in);
BufferedReader input = new BufferedReader(pippo);


Ciao :)