mark9 ha scritto:
Vorrei capire l'ordine di wrapping e come usare queste classi.
Non è che c'è un "ordine" ... dipende da cosa devi fare. A parte alcune classi particolari (es. File, RandomAccessFile), il concetto essenziale è che tutte le classi di I/O nel package java.io sono "modellate" secondo il noto Design Pattern "Decorator".
https://it.wikipedia.org/wiki/Decorato
Con questa filosofia, ciascuna classe si occupa principalmente di UN aspetto specifico del I/O. Se cerchi ad esempio una
singola classe che sappia fare: leggere da file, bufferizzare, leggere a righe. Questa singola classe NON esiste.
C'è una classe che "sa" solo leggere caratteri da file, FileReader (oltretutto solo con il charset predefinito). C'è una classe che "sa" solo bufferizzare, BufferedReader (e come "plus" sa leggere a righe). E allora le puoi comporre insieme, crei un FileReader e lo incapsuli in un BufferedReader.
Si possono fare molte "catene" di classi di I/O. E certe non hanno senso. Non ha senso ad esempio incapsulare un DataInputStream dentro un BufferedInputStream. La peculiarità di DataInputStream è di fornire una API più "espansa" per avere metodi come readInt(), readDouble(), ecc...
Se la incapsuli in un BufferedInputStream, non "vedi" più nulla di questo e DataInputStream farebbe solo da (inutile) "passacarte" di byte.
mark9 ha scritto:
devo creare un'altra variabile dove memorizzare la readLine()
Ma questo è ovvio ... readLine() restituisce un oggetto String (la riga letta). Lo devi assegnare o passare altrove per fare qualcosa di utile (a meno che vuoi leggere una riga "a vuoto", senza farci nulla).