Java IO
Java IO
Stream di input
Stream di output
Stream di caratteri
Stream di byte
Stream di
Stream di dati
manipolazione
stream di dati
stream di manipolazione
Input di Output di
Input di byte Output di byte
caratteri caratteri
Fondamenti di Informatica L-B
La gerarchia degli stream di byte
Object
InputStream OutputStream
SequenceInputStream
ByteArrayInputStream ByteArrayOutputStream
FileInputStream FileOutputStream
ObjectInputStream ObjectOutputStream
PipedInputStream PipedOutputStream
FilterInputStream FilterOutputStream
BufferedInputStream BufferedOutputStream
DataInputStream DataOutputStream
PrintStream
FileInputStream FileOutputStream
BufferedInputStream BufferedOutputStream
DataInputStream DataOutputStream
PrintStream
FileInputStream
file su
disco
Stream di byte – input da file
• Per aprire un file binario in lettura si crea un oggetto di
classe FileInputStream, specificando il nome del file
all'atto della creazione.
• Per leggere dal file si usa poi il metodo read() che
permette di leggere uno o più byte
– restituisce il byte letto come intero fra 0 e 255
– se lo stream è finito, restituisce -1
– se non ci sono byte, ma lo stream non è finito,
rimane in attesa dell'arrivo di un byte.
...
public static void main(String[] args) {
try {
leggiFile("immagine.bmp");
}
catch (FileNotFoundException ex) {
System.out.println("File non trovato");
}
catch(IOException ex) {
System.out.println("Errore di input");
}
}
}
input da file – esempio
Stream di byte – output su file
FileOutputStream
file su
disco
stream di byte – output su file
• Per aprire un file binario in scrittura si crea un oggetto
di classe FileOutputStream, specificando il nome del
file all'atto della creazione
• Un secondo parametro opzionale, di tipo boolean,
permette di chiedere l'apertura in modo append
• Per scrivere sul file si usa il metodo write() che
permette di scrivere uno o più byte
– scrive l'intero [0, 255] passatogli come parametro
– non restituisce nulla
try {
scriviFile("prova.dat");
}
catch(FileNotFoundException e) {
System.out.println("Impossibile aprire file");
}
catch(IOException ex) {
System.out.println("Errore di output;
}
}
}
Stream di byte – output su file
Esperimenti
• Provare a rileggere il file con il programma precedente
• Aggiungere altri byte riaprendo il file in modo append
Stream di incapsulamento
• Gli STREAM di incapsulamento hanno come scopo
quello di “avvolgere” un altro STREAM per creare
un’entità con funzionalità più evolute.
InputStream
Il loro costruttore ha
quindi come parametro stream incapsulante
un InputStream o un
OutputStream già
esistente.
OutputStream
stream incapsulante
Stream di incapsulamento - INPUT
• BufferedInputStream
aggiunge un buffer e ridefinisce read() in modo da
avere una lettura bufferizzata
• DataInputStream
definisce metodi per leggere i tipi di dati standard in
forma binaria: readInt(), readFloat(), ...
• ObjectInputStream
definisce un metodo per leggere oggetti serializzati
(salvati) da uno stream, offre anche metodi per
leggere i tipi primitivi di Java
Stream di incapsulamento - OUTPUT
• BufferedOutputStream
aggiunge un buffer e ridefinisce write() in modo da avere una
scrittura bufferizzata
• DataOutputStream
definisce metodi per scrivere i tipi di dati standard in forma
binaria: writeInt(), writeFloat() ...
• PrintStream
definisce metodi per stampare come stringa valori primitivi ( es.
print(int)) e classi standard (es. print(Object))
• ObjectOutputStream
definisce un metodo per scrivere oggetti “serializzati”; offre
anche metodi per scrivere i tipi primitivi di Java
Esempio - OUTPUT
• Si incapsula FileOutputStream
dentro un DataOutputStream
FileOutputStream
DataOutputStream
Esempio - OUTPUT
import java.io.*;
public class EsScriviFile2 {
public static void scriviFile(String filename)
throws FileNotFoundException, IOException {
try {
scriviFile("fileOut.bin");
}
catch(FileNotFoundException e) {
System.out.println("Impossibile aprire file");
}
catch(IOException ex) {
System.out.println("Errore di output;
}
}
}
Esempio - INPUT
▪ Lettura di dati da file binario
• Per leggere da un file binario occorre un
FileInputStream, che però consente solo di leggere
un byte o un array di byte
• Volendo leggere dei float, int, double,
boolean, … è molto più pratico un DataInputStream,
che ha metodi idonei
• Si incapsula FileInputStream
dentro un DataInputStream
FileInputStream
DataInputStream
esempio - INPUT
import java.io.*;
public class EsLeggiFile2 {
public static void leggiFile(String filename)
throws FileNotFoundException, IOException {
try {
leggiFile("fileOut.bin");
}
catch(FileNotFoundException e) {
System.out.println("Impossibile aprire file");
}
catch(IOException ex) {
System.out.println("Errore di output;
}
}
}
Esempio - risultato
Gli stream di caratteri
▪ Le classi per l’I/O da stream di caratteri (Reader e
Writer) sono più efficienti di quelle a byte
▪ Hanno nomi analoghi e struttura analoga
▪ Convertono correttamente la codifica UNICODE di
Java in quella locale:
▪ specifica del sistema operativo: Windows, Mac OS-
X, Linux… (tipicamente ASCII)
▪ e della lingua in uso
(essenziale per l’internazionalizzazione)
▪ Per esempio gestiscono correttamente le lettere
accentate e gli altri segni diacritici delle lingue
europee
Object
Reader Writer
BufferedReader BufferedWriter
CharArrayReader CharArrayWriter
InputStreamReader OutputStreamWriter
StringReader StringWriter
PipedReader PipedWriter
FilterReader FilterWriter
PrintWriter
FileReader
FileWriter
Tastiera
• Si incapsula FileReader
dentro un BufferedReader
FileReader
BufferedReader
Stream di incapsulamento - OUTPUT
• Si incapsula FileWriter
dentro un PrintWriter FileWriter
PrintWriter
Esempio – INPUT/OUTPUT
import java.io.*;
public class CopyLines {
...
public static void main(String[] args) {
try {
copyLines("testo.txt");
}
catch(IOException ex) {
System.out.println("Errore di I/O.");
}
}
}
Esempio – INPUT/OUTPUT
import java.io.*;
public class CopyLines {
BufferedReader input =
new BufferedReader(new InputStreamReader(System.in));
FileWriter fw = new FileWriter(filename);
PrintWriter output = new PrintWriter(fw);
catch (FileNotFoundException e)
{
System.out.println("File " + file + " not found.");
}
catch (IOException e)
{
System.out.println(e);
}
}
}
• A proposito di indipendenza…
Ogni sistema operativo utilizza convenzioni diverse per
separare le varie directory in un path. Esempio: in
Linux “ / ”, in Windows “ \ ”;
• Costruttore:
public File(String path)
Classe File – metodi utili
• public String getName()restituisce il nome dell’oggetto
• public String getAbsolutePath()restituisce il percorso
assoluto dell’oggetto
• public boolean exist()restituisce vero se l’oggetto File esiste
• public boolean isDirectory()restituisce vero se l’oggetto File
è una directory
• public long length()restituisce la lunghezza in byte dell’oggetto
• public boolean renameTo(File dest)rinomina l’oggetto
• public boolean delete()cancella l’oggetto File
• public boolean mkdir()crea una directory che corrisponde
all’oggetto File
• public String[] list()restituisce un vettore contenente il
nome di tutti file della directory associata all’oggetto File
classe RandomAccessFile
• Consente l’accesso in modo RANDOM (cioè non sequenziale),
ai file.
• Consente l’accesso ad un file contemporaneamente in scrittura
e il lettura.
• Implementa le interfacce DataInput e DataOutput, rendendo
possibile la scrittura in file di tutti gli oggetti e i tipi primitivi.
• Costruttori:
public RandomAccessFile(String file, String mode)
public RandomAccessFile(File file, String mode)
• Le classi ObjectOutputStream e
ObjectInputStream offrono questa funzionalità per
qualunque tipo di oggetto.
serializzazione di oggetti
▪ Le due classi principali sono:
• ObjectInputStream
– legge oggetti serializzati salvati su stream, tramite
il metodo readObject()
– offre anche metodi per leggere i tipi primitivi di
Java
• ObjectOutputStream
– scrive un oggetto serializzato su stream, tramite il
metodo writeObject()
– offre anche metodi per scrivere i tipi primitivi di
Java
serializzazione di oggetti
• Una classe che voglia essere “serializzabile” deve
implementare l’interfaccia Serializable
import java.io.*;
…
public static void main(String[] args) {
try {
scriviPunto("punti.bin");
}
catch(IOException ex) {
System.out.println("Errore di I/O.");
System.exit(1);
}
}
}
Esempio - serializzazione
LETTURA DA FILE…
import java.io.*;
public class LeggiPunto {
public static void leggiPunto(String filename)
throws IOException, ClassNotFoundException {
……
public static void main(String[] args) {
try {
leggiPunto("punti.bin");
}
catch(IOException ex) {
System.out.println("Errore I/O: " + ex.getMessage());
System.exit(1);
}
catch(ClassNotFoundException ex) {
System.out.println("Errore: " + ex.getMessage());
System.exit(2);
}
}
}
Esercizio
Uso di stream Java nel web
• Package java.net
Concetti (classi) fondamentali per TCP (connessione):
– Socket, ServerSocket, URL, URLConnection
new URL("http://www.unife.it/ing/informazione");
URLConnection c = url.openConnection();
Possiamo provarlo sia coi file che con gli indirizzi internet.
NOTA: Ricordarsi il protocollo!!