1. Lezione 1: Introduzione
Corso di Programmazione in Rete
Laurea Magistrale in Ing. Informatica
Università degli Studi di Salerno
1
2. Outline
✦ Presentazione del corso
✦ Riepilogo dell’I/O in Java
✦ Riepilogo dei Thread in Java
2
3. Presentazione del corso
✦ Obiettivi
• Apprendere le principali tecnologie per la
realizzazione di applicazioni distribuite
✦ Prerequisiti
• Linguaggio Java
• Concetti di base sulle reti di calcolatori e sui
protocolli di Internet
3
4. Presentazione del corso
✦ Materiale didattico
• Libro di testo da definire
✦ Modalità di esame
• Elaborato + Colloquio orale
4
5. Input/output in Java
✦ La libreria standard Java definisce
numerose classi per gestire l’I/O
• modularità: separazione in classi diverse di
aspetti quali l’origine/destinazione dell’I/O, il
formato dei dati, il buffering
• componibilità: le funzioni delle diverse classi
possono essere combinate (attraverso il pattern
“Adapter”)
✦ Distinzione tra I/O in termini di byte e I/O
in termini di caratteri (per gestire
correttamente l’internazionalizzazione)
5
6. Input/Output binario
✦ Tutte le classi che considereremo sono nel
package java.io
✦ Le classi di base della gerarchia sono
InputStream e OutputStream, che
rappresentano oggetti dai quali è
possibile leggere o sui quali è possibile
scrivere sequenze di byte
6
7. Input/Output binario
✦ Metodi principali di InputStream:
• int read()
‣ Restituisce il valore del byte letto, o -1
• void close()
✦ Metodi principali di OutputStream:
• void write(int b)
• void close()
✦ I metodi possono lanciare un’eccezione
(controllata) di tipo IOException
7
8. Input/Output binario
✦ Esempio
import java.io.*;
public class IOEsempio1 {
public static void copia(InputStream in, OutputStream out) throws IOException {
int b;
while ((b=in.read())!=-1)
out.write(b);
}
public static void main(String args[]) throws IOException {
copia(System.in, System.out);
}
}
8
9. Input/Output binario
✦ InputStream e OutputStream sono classi
astratte
✦ Le sottoclassi concrete rappresentano
stream di input/output associati a
particolari sorgenti/destinazioni di byte
(es. file, connessioni di rete, aree di
memoria)
✦ System.in e System.out sono oggetti di
classi derivanti da InputStream e
OutputStream
9
10. I/O binario su file
✦ Le classi FileInputStream e
FileOutputStream rappresentano stream
associati a file
✦ Costruttori:
• FileInputStream(String fileName)
• FileOutputStream(String fileName)
• FileOutputStream(String filename, boolean
append)
‣ Se append è true, l’output va in coda al file già esistente
10
11. I/O binario su file
✦ Esempio
import java.io.*;
public class IOEsempio2 {
public static void copia(InputStream in, OutputStream out) throws IOException {
int b;
while ((b=in.read())!=-1)
out.write(b);
in.close();
out.close();
}
public static void main(String args[]) throws IOException {
FileInputStream in=new FileInputStream(args[0]);
FileOutputStream out=new FileOutputStream(args[1]);
copia(in, out);
}
}
11
12. I/O su array di byte
✦ Le classi ByteArrayInputStream e
ByteArrayOutputStream consentono di
effettuare operazioni di I/O in memoria,
utilizzando come supporto un array di
byte
✦ Costruttori
• ByteArrayInputStream(byte[] array)
• ByteArrayInputStream(byte [] array[], int offset,
int len)
• ByteArrayOutputStream()
‣ Accesso all’array prodotto col metodo byte[] toByteArray()
12
13. I/O su array di byte
✦ Esempio
import java.io.*;
public class IOEsempio3 {
public static void copia(InputStream in, OutputStream out) throws IOException {
int b;
while ((b=in.read())!=-1)
out.write(b);
}
public static void main(String args[]) throws IOException {
byte[] a={'H', 'e', 'l', 'l', 'o', 'n' };
ByteArrayInputStream in=new ByteArrayInputStream(a);
copia(in, System.out);
}
}
13
14. I/O binario di altri tipi
✦ Le classi DataInputStream e
DataOutputStream consentono di leggere
dati dei tipi primitivi (in formato binario)
✦ Costruttori:
• DataInputStream(InputStream in)
• DataOutputStream(OutputStream out)
✦ Metodi
• int readInt(); char readChar(); ...
‣ eccezione EOFException su fine del file
• void writeInt(int i); void writeChar(char c); ...
14
15. I/O bufferizzato
✦ Le classi BufferedInputStream e
BufferedOutputStream consentono la
bufferizzazione dell’I/O
✦ Costruttori:
• BufferedInputStream(InputStream in)
• BufferedOutputStream(OutputStream out)
15
16. Combinazione delle funzioni
✦ Le varie classi viste finora possono
lavorare insieme creando una “catena di
montaggio”
✦ Esempio: come faccio a leggere un
insieme di interi (in binario) da un file
usando un input bufferizzato?
public static void main(String args[]) throws IOException {
DataInputStream din=new DataInputStream(
new BufferedInputStream(
new FileInputStream(args[0])));
int x=din.readInt();
// ... etc etc ...
}
16
17. I/O di caratteri
✦ Internamente Java rappresenta i caratteri
usando il sistema Unicode
• Unicode gestisce correttamente i caratteri delle
lingue non europee
✦ Problema: i dispositivi di I/O lavorano in
termini di byte, non in termini di caratteri
Unicode
✦ Occorre una codifica (“encoding”) per
specificare come ciascun carattere viene
tradotto in una sequenza di byte
• sfortunatamente, non esiste una codifica unica
accettata come standard da tutte le piattaforme
17
18. I/O di caratteri
✦ Alcune codifiche utilizzate
frequentemente:
• ISO-Latin-1 (ISO-8859-1)
‣ 1 byte per carattere, consente solo la codifica dei caratteri
dell’Europa occidentale
• UTF-8
‣ da 1 a 3 byte per carattere (lunghezza variabile)
‣ i caratteri ASCII sono codificati con 1 byte, mantenendo la
compatibilità all’indietro con il set ASCII
• UTF-16BE, UTF-16LE
‣ codifica a lunghezza variabile in multipli di 16 bit
‣ BE=big endian, LE=little endian
18
19. I/O di caratteri
✦ Java mette a disposizione due classi base,
Reader e Writer, che effettuano l’I/O in
termini di caratteri anziché byte
✦ È possibile costruire Reader/Writer da
InputStream/OutputStream specificando
la codifica da usare
• se la codifica non è specificata si usa un default
dipendente dalla piattaforma corrente
(sconsigliato)
19
20. I/O di caratteri
✦ Le classi InputStreamReader e
OutputStreamWriter rappresentano un
Reader/Writer agganciato a un
InputStream/OutputStream
✦ Costruttori:
• InputStreamReader(InputStream in, String
encoding)
• OutputStreamWriter(OutputStream out, String
encoding)
20
21. I/O di caratteri
✦ Esempio
import java.io.*;
public class IOEsempio4 {
public static void copia(Reader in, Writer out) throws IOException {
int c;
while ((c=in.read())!=-1)
out.write(copia);
in.close();
out.close();
}
public static void main(String args[]) throws IOException {
InputStreamReader r=new InputStreamReader(System.in, "UTF-8");
OutputStreamWriter w=new OutputStreamWriter(System.out, "UTF-8");
copia(r, w);
}
}
21
22. I/O di caratteri
✦ Le classi FileReader e FileWriter sono
classi di comodo per associare un reader/
writer a un file
✦ Le classi BufferedReader e BufferedWriter
realizzano il buffering
✦ Le classi StringReader e StringWriter
effettuano l’I/O su stringhe
✦ La classe PrintWriter mette a disposizione
i metodi print(...) e println(...) per
stampare dati di vari tipi in formato testo
22
23. Serializzazione
✦ Java dispone di un meccanismo detto
serializzazione per convertire un oggetto
in una sequenza di byte e viceversa
✦ Utile, ad es. per salvare oggetti su un file
o trasmetterli attraverso una connessione
di rete
23
24. Serializzazione
✦ Ogni classe può essere serializzata,
purché implementi l’interfaccia
Serializable (definita in java.io)
✦ Serializable è un’interfaccia “marker”,
ovvero non definisce nessun metodo
24
25. Serializzazione
✦ Le classi ObjectOutputStream e
ObjectInputStream consentono di fare la
serializzazione
✦ Metodi di ObjectOutputStream
• tutti i metodi di DataOutputStream +
• void writeObject(Object obj)
✦ Metodi di ObjectInputStream
• tutti i metodi di DataInputStream +
• Object readObject()
25
26. Serializzazione
✦ Esempio
import java.io.*;
public class IOEsempio5 implements Serializable {
public int dato;
public IOEsempio5(int d) {
dato=d;
}
public static void main(String args[]) throws IOException {
ObjectOutputStream out=new ObjectOutputStream(
new FileOutputStream(args[0]));
IOEsempio5 obj=new IOEsempio5(4242);
out.writeObject(obj);
out.close();
}
}
26