Creato da pastuweb.com
Share My Page
My Social Accounts
Account FaceBook Account LinkedIn Account Twitter Account Google Plus Account Git Hub

Le classi che si andranno a vedere sono all'interno di

  • java.io.*   (I/O Stream)
  • java.nio.file.* (File I/O)

Un'I/O Stream rappresnta una generica sorgente di input o una generica destinazione di output. Uno stream può rappresentare un file su disco, una periferica, altri programmi e aree di memoria.

Gli Stream possono supportare diversi tipi di dati, inclusi bytes, dati primitivi, caratteri e oggetti. Alcuni stream non fanno altro che passare dei dati, altri manipolano e trasformano i dati con cui vengono in contatto. 

Uno stream è una SEQUENZA DI DATI.

Byte Streams

Servono per effettuare stream di bytes da 8-bit. 

Le classi usate, FileInputStream e FileOutputStream, sono figlie di InputStream e OutputStream.

import java.io.FileInputStream;

import java.io.FileOutputStream;

import java.io.IOException;

public class CopyBytes{

public static void main(Sring[] args) throws IOException{

FileInputStream in = null;

FileOutputStream out = null;

try{

in = new FileInputStream("input.txt");

out = new FileOutputStream("output.txt");

int c;

while ( (c = in.read()) != -1 ){

out.write(c);

}

}finally{

if(in != null)

in.close();

if(out != null)

out.close();

}

}

}

Viene letto un byte per volta e viene scritto un byte per volta.

E' importante chiudere sempre gli stream, in questo modo si evita di sprecare memoria.

I Byte Stream si dovrebbero usare SOLO per streaming a livello di byte, perchè per gli altri casi ce ne sono di più specifici.

Character Streams

Si usano le classi FileReader e FileWriter che sono figlie di Reader e Writer.

import java.io.FileReader;

import java.io.FileWriter;

import java.io.IOException;

public class CopyCharacters{

public static void main(Sring[] args) throws IOException{

FileReader in = null;

FileWriter out = null;

try{

in = new FileReader("input.txt");

out = new FileWriter("output.txt");

int c;

while ( (c = in.read()) != -1 ){

out.write(c);

}

}finally{

if(in != null)

in.close();

if(out != null)

out.close();

}

}

}

Solitamente si leggono delle righe di caratteri NON CARATTERE per CARATTERE. Ecco un alternativa:

import java.io.FileReader;

import java.io.FileWriter;

import java.io.BufferedReader;

import java.io.PrintWriter;

import java.io.IOException;

public class CopyLines{

public static void main(Sring[] args) throws IOException{

BufferedReader in = null;

PrintWriter out = null;

try{

in = new BufferedReader(new FileReader("input.txt"));

out = new PrintWriter(new FileWriter("output.txt"));

String l;

while ( (l = in.readLine()) != null ){

out.println(l);

}

}finally{

if(in != null)

in.close();

if(out != null)

out.close();

}

}

}

Da notare che ho usato un Buffer, in questo modo si ottimizza la lettura e scrittura.

Buffered Streams

Il non usare un Buffer può rallentare la lettura e scrittura di streams, dipende dal Sistema Operativo. Ogni accesso ad un file può generare un accesso al disco, alla rete o comunque qualcosa di costoso a livello di tempo.

Per gestire tempo e risorse sono stati ideati di Buffered I/O Streams.

I Buffered Input Streams leggono i dati da un'area di memoria chiamata buffer, le periferiche fisiche vengono chiamate solo all'inizio per riempire il buffer. I Buffered Output Streams scrivono i dati su un un buffer, le periferiche vengono chiamate solo quando il buffer è pieno.

Nell'esempio precedente abbiamo visto come usare il Buffered Streams.

Di solito un buffer scrive su una periferica quando E' PIENO.

Il processo di scrivere su una periferica quando il buffer non è ancora pieno si chiama flushing del buffer.

L'autoflush è automatico se si usa PrintWriter con println() o format(). Per forzare il flush usare flush().

 

ByteArray to BufferedReader
In questo esempio mostro come leggere linea per linea un input di tipo byte[] (array di byte)

import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;

public class ByteArrayToReader {

	public static void main(String args[]){
		
		String str = "converting to input stream"+
						"\n and this is second line";
		byte[] content = str.getBytes();
		InputStream is = null;
		BufferedReader bfReader = null;
		try {
			is = new ByteArrayInputStream(content);
			bfReader = new BufferedReader(new InputStreamReader(is));
			String temp = null;
			while((temp = bfReader.readLine()) != null){
				System.out.println(temp);
			}
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			try{
				if(is != null) is.close();
			} catch (Exception ex){
				
			}
		}
		
	}
}
 

 

Standard Streams e la Console

Leggono l'input da tastiera e lo scrivono a video:

  • System.in
  • System.out
  • System.err

Un'alternativa è la Console.

  • System.console()

La Console supporta l'inserimento sicuro di password tramite il metodo readPassword.

import java.io.Console;

import java.util.Arrays;

import java.io.IOException;

public class Password{

public static void main(Sring[] args) throws IOException{

Console c = System.console();

if(c == null){

System.err.println("No Console");

System.exit(1);

}

String login = c.readLine("Il tuo USerName:");

char [] password = c.readPassword("La tua password: ");

/* codice di controllo login e password*/

}

}

Average (1 Vote)
The average rating is 5.0 stars out of 5.