Salve a tutti, ho deciso di creare questa guida per mostrare come lavorare con gli stream in java.

 

Innanzitutto introduciamo il concetto di stream. Uno stream è un flusso di dati (byte per la precisione). Molti oggetti in java sono a tutti gli effetti degli stream o comunque è possibile lavorare su di loro tramite gli stream.

Ora vediamo come è possibile scrivere su uno stream.

Chiunque abbia iniziato a lavorare con java ha, molto probabilmente, già lavorato (anche inconsciamente magari) con uno stream. Infatti il famosissimo programma che stampa a video "This is not an Hello Word program" lavora su uno stream. Andiamo a vedere in dettaglio come funziona.

 

La classe che permette la scrittura su uno stream è la classe PrintWriter. La classe PrintWriter ha diversi metodi che saranno comuni a chiunque abbia mai stampato qualcosa su consolle. Infatti la variabile out della classe System altri non è che un PrintWriter. Dunque quando scriviamo:

 

System.out.println("This is not an Hello World program!");

Accediamo alla variabile out (di tipo PrintWriter) nella classe System e invochiamo il metodo println() che scrive sullo stream.

Allo stesso modo possiamo utilizzare PrintWriter per scrivere su qualsiasi stream. Ecco ad esempio come scrivere su di un file:

 

 

//apriamo un nuovo collegamento con il file.
File f= new File("miofile");
//creiamo un outputstream con il file.
FileOutputStream fos= new FileOutputStream(f);
//creiamo un nuovo printwriter per scrivere sull'outputstream del file passandogli come parametro l'output stream del file.
PrintWriter pw=new PrintWriter(fos);
//scriviamo la stringa ciao sul file.
pw.println("ciao");

Visto? Nulla di più semplice e familiare, al posto di stampare a video stampiamo su un file.

 

Ma ora cerchiamo di vedere come leggere da uno stream. Se per scrivere su uno stream abbiamo bisogno dell'output stream, per leggere abbiamo bisogno di un input stream. Anche in questo caso abbiamo una analogia con la classe System. Infatti la variabile in all'intero della classe System è proprio un InputStream. Ma come per scrivere su uno stream abbiamo bisogno di un PrintWriter (per agevolarci) anche per leggere agilmente da uno stream utilizziamo un'altra classe: BufferedReader. Questa classe ha un costruttore che prende in input un InputStreamReader, la quale a sua volta prende in input uno InputStream. Dunque andiamo a vedere un po di codice utilizzando sempre come esempio un file.

 

//come prima apriamo il file.
File f= new File("miofile");
//creiamo un nuovo input stream col file
FileInputStream fis= new FileInputStream(f);
//creiamo il nostro lettore di buffer
BufferedReader br= new BufferedReader(new InputStreamReader(fis));
//creiamo una variabile dove salvare di volta in volta le varie righe dello stream
String line="";
//creiamo un ciclo che va avanti fino a che non legge tutto lo stream
//la funzione readLine ritorna una linea dallo stream, ovvero una stringa fino al prossimo \n
while((line=br.readLine())!=null){
//stampiamo la riga
System.out.println(line);
}

Anche questo molto semplice (l'unica istruzione un po complicata è la clausola del while).

Questo è quanto bisogna sapere per iniziare a lavorare con gli stream, quindi da ora in poi quando vedrete un getInputStream() o getOutputStream() saprete cosa fare!! ;)