Lezione 1: I/O in Java

4,506
-1

Published on

✦ Presentazione del corso
✦ Riepilogo dell’I/O in Java
✦ Riepilogo dei Thread in Java

Published in: Education
1 Comment
3 Likes
Statistics
Notes
No Downloads
Views
Total Views
4,506
On Slideshare
0
From Embeds
0
Number of Embeds
2
Actions
Shares
0
Downloads
0
Comments
1
Likes
3
Embeds 0
No embeds

No notes for slide

Lezione 1: I/O in Java

  1. 1. Lezione 1: Introduzione Corso di Programmazione in Rete Laurea Magistrale in Ing. Informatica Università degli Studi di Salerno 1
  2. 2. Outline ✦ Presentazione del corso ✦ Riepilogo dell’I/O in Java ✦ Riepilogo dei Thread in Java 2
  3. 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. 4. Presentazione del corso ✦ Materiale didattico • Libro di testo da definire ✦ Modalità di esame • Elaborato + Colloquio orale 4
  5. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 15. I/O bufferizzato ✦ Le classi BufferedInputStream e BufferedOutputStream consentono la bufferizzazione dell’I/O ✦ Costruttori: • BufferedInputStream(InputStream in) • BufferedOutputStream(OutputStream out) 15
  16. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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

×