Lezione 1: Introduzione
        Corso di Programmazione in Rete
       Laurea Magistrale in Ing. Informatica
         Università degli Studi di Salerno



1
Outline
    ✦ Presentazione del corso

    ✦ Riepilogo dell’I/O in Java

    ✦ Riepilogo dei Thread in Java




2
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
Presentazione del corso


    ✦ Materiale didattico
     •   Libro di testo da definire
    ✦ Modalità di esame
     •   Elaborato + Colloquio orale




4
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
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
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
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
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
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
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
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
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
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
I/O bufferizzato

     ✦ Le classi BufferedInputStream e
       BufferedOutputStream consentono la
       bufferizzazione dell’I/O
     ✦ Costruttori:
      •   BufferedInputStream(InputStream in)
      •   BufferedOutputStream(OutputStream out)




15
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
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
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
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
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
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
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
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
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
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
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

Lezione 1: I/O in Java

  • 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 sufile ✦ 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 sufile ✦ 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 arraydi 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 arraydi 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 dialtri 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