Corso Java Input/Output in Java Docente: Dott. Marco Bianchi Slide realizzate da Ing. A.Bei, Dott. M.Bianchi, Dott. F.Lombardi
Input/Output in Java Per effettuare operazioni di I/O in Java è possibile utilizzare, importandolo, il package java.io. Per utilizzare tutte le classi del tale package nel proprio programma si deve aggiungere l istruzione seguente: import java.io.*; In questo corso verranno spiegati i concetti utili per utilizzare i file e la rete.
Input/Output in Java La libreria delle classi Java è di una vastità non indifferente Approccio adottato in questo corso: descrizione delle classi fondamentali e delle funzionalità più importanti Esercizi per mettere in pratica quanto spiegato Per una descrizione più approfondita si consiglia l uso della documentazione ufficiale del package
Input/Output in Java Il package java.io include classi, interfaccie ed eccezioni per la gestione dell I/O Distinguiamo tra due classi di funzionalità: Funzionalità per accedere ad informazioni relative ai file ed alle directory. Esempio: Dimensione dei file, elenco dei file contenuti in una directory,... Funzionalità per leggere e scrivere dati
Classe per accesso alle informazioni riguardanti il file system La classe fondamentale per accedere alle informazioni relative ai file ed alle directory è la classe File E importante tenere presenti i problemi di portabilità del codice: Path Unix: Windows: Percorso di un file Unix: Windows: /bin:/usr/bin:/usr/local/bin c:\bin;c:\java\bin /usr/java/bin/javac c:\java\bin
La classe java.io.file: agenda Della classe File verranno presentati: Le costanti I costruttori I metodi principali Un esempio di utilizzo Al termine della presentazione verrà proposto un esercizio.
La classe java.io.file: le costanti public static final String separator il separatore di file (stringa) public static final char separatorchar il separatore di file (carattere) public static final String pathseparator il separatore di path (stringa) public static final char pathseparatorchar il separatore di path (carattere)
La classe java.io.file: esempio import java.io.*; public class Prova { public static void main(string args[]){ System.out.println( File.separator + " - + File.separatorChar + " - + File.pathSeparator + " - + File.pathSeparatorChar); } } Output (su Windows): \ - \ - ; - ;
La classe java.io.file: costruttori public File(String path) Esempio: File f = new File( C:\prova.txt ); File cartella = new File( C:\cartella ); public File(String path, String name) Esempio: File f = new File( C:\, prova.txt ); public File(File dir, String name) Esempio: File f = new File(cartella, prova.txt );
La classe java.io.file: metodi public String getname() public String getpath() public String getparent() può ritornare null se non esiste il parent public boolean exists() public boolean canread() public boolean canwrite() public boolean isfile() public boolean isdirectory () public long lastmodified() public long length() public boolean mkdir() public boolean mkdirs() public boolean renameto (File dest) public String[] list() public String[] list (FilenameFilter f) public boolean delete()
La classe java.io.file: Esercizio Scrivere un programma chiamato Info che analizza il contenuto di args[0]: Se args[0] contiene il nome di un file allora stampa le dimensioni del file indicato; Se args[0] contiene il nome di una cartella allora stampa la lista di file contenuti nella cartella indicata. Prima dell esercizio verrà fatto vedere un esempio pratico dell utilizzo del programma da realizzare. Per chi finisce prima: ricercare sulla documentazione ufficiale e utilizzare i metodi che forniscono ulteriori informazioni riguardanti file e directory. Adattare il programma.
Lettura e scrittura di dati Distinguiamo tra classi per l accesso sequenziale ai dati di utilizzo generale, non limitate ai file classi per l accesso diretto (random) a dati contenuti su file
Accesso sequenziale ai dati Il meccanismo di lettura e scrittura sequenziale dei dati è basato sul concetto di stream Uno stream è un oggetto sul quale è possibile leggere e scrivere dati sequenzialmente Il package java.io include numerose classi per la gestione di stream
Gli stream I programmi Java comunicano, cioè effettuano l I/O, tramite gli stream (flussi). Uno stream: è un astrazione ad alto livello che produce o consuma informazioni; rappresenta un collegamento a un dispositivo fisico del sistema I/O di Java.
Schematizzazione degli stream Stream di input: Programma java Stream di output Input Stream Dispositivo I/O I dispositivi di I/O possono essere file. memoria, rete, ecc. Programma java Dispositivo I/O Output Stream
Algoritmi standard di lettura-scrittura Gli algoritmi standard di lettura e scrittura prevedono tre fasi: Algoritmo di lettura 2) Apertura dello stream di input 3) while ci sono dati da leggere : Leggi i dati in input 4) Chiusura dello stream Algoritmo di scrittura 2) Apertura dello stream di output 3) while ci sono dati da scrivere : Scrivi i dati in output 4) Chiusura dello stream
Classificazione degli stream Gli stream possono essere suddivisi per tipo di dato: stream di caratteri (16 bit) stream di byte (8 bit) funzionalità: data sink stream: durante il transito i dati non sono processati processing stream: i dati vengono processati (es: bufferizzazione)
Stream di caratteri Le classi astratte Reader e Writer forniscono le API e una parziale implementazione di stream di caratteri, rispettivamente, di input e output; Le sottoclassi di Reader e Writer implementano stream specializzati;
Stream di caratteri per leggere in bianco: processing stream in grigio: data sink stream
Stream di caratteri per scrivere in bianco: processing stream in grigio: data sink stream
Stream di caratteri Data Sink Stream fondamentali: CharArrayReader, CharArrayWriter: lettura e scrittura in memoria; FileReader, FileWriter: lettura e scrittura su File; PipedReader, PipedWriter: Implementano le componenti input e output di una Pipe. Le pipe sono utilizzate per la comunicazione tra thread. PipedReader e PipedWriter sono collegati o tramite costruttori o tramite il metodo connect.
Stream di caratteri Processing Stream fondamentali: BufferedReader, BufferedWriter: lettura e scrittura bufferizzata riduce gli accessi aumenta l efficienza; LineNumberReader: lettura bufferizzata tenendo traccia delle linee. Possiede il metodo ReadLine() per leggere linea per linea.
Stream di caratteri: esempio (1/3) import java.io.*; /* questo programma copia il file input.txt sul file output.txt */ public class Copia { public static void main(string[] args) throws Exception { File inputfile = new File("input.txt"); File outputfile = new File("output.txt"); [continua]
Stream di caratteri: esempio (2/3) /* L oggetto in è uno stream di input associato * al file inputfile. L oggetto out è uno stream * di output associato al file outputfile. */ FileReader in = new FileReader(inputFile); FileWriter out = new FileWriter(outputFile); /* L oggetto inb è uno stream di input * bufferizato a partire da in. L oggetto outb è * uno stream bufferizato a partire da out */ BufferedReader inb = new BufferedReader(in); BufferedWriter outb = new BufferedWriter(out); [continua]
Stream di caratteri: esempio (3/3) /* Scrivi su outb i caratteri letti da inb * finchè ce ne sono */ int c; while ((c = inb.read())!= -1) outb.write(c); /* Chiusura degli stream */ inb.close(); outb.close(); } }
Stream di byte Le classi astratte InputStream e OutputStream forniscono le API e una parziale implementazione di stream di byte di input e output; Le sottoclassi di InputStream e OutputStream implementano stream di byte specializzati;
Stream di byte per leggere in bianco: processing stream in grigio: data sink stream
Stream di byte per scrivere in bianco: processing stream in grigio: data sink stream
Stream di byte Funzioni analoghe alle classi che implementano stream di char tranne che per le classi: ObjectOutputStream, ObjectInputStream; Queste permettono di serializzare un oggetto ovvero di codificarlo come stream di byte per poi salvarlo o trasmetterlo via rete.
Stream di byte: esempio (1/2) Salvataggio di due oggetti in un file: FileOutputStream out = new FileOutputStream( temp.dat"); ObjectOutputStream s = new ObjectOutputStream(out); // Scrive nel file Tempo 2 oggetti: la stringa Oggi s.writeobject( Oggi"); // ed un oggetto di tipo Date() s.writeobject(new Date()); s.flush(); Nota: Gli oggetti String e Date sono serializzabili perché implementano l interfaccia Serializable
Stream di byte: esempio (2/2) Recupero di due oggetti salvati su un file: FileInputStream in = new FileInputStream ( temp.dat"); ObjectInputStream s = new ObjectInputStream(in); // Gli oggetti vengono letti dal file Tempo String today = (String)s.readObject(); Date date = (Date)s.readObject(); Nota: Gli oggetti String e Date sono serializzabili perché implementano l interfaccia Serializable
Ultimi argomenti: Introduzione alla classe RandomAccessFile, utile per gestire file ad accesso diretto. Approfondimento sulla classe System
La classe RandomAccessFile La classe RandomAccessFile consente la lettura e la scrittura di file ad accesso casuale; Supporta il concetto di file pointer per il mantenimento della posizione corrente nel file. Il file pointer è l offset in byte dall inizio del file; Per il posizionamento del file pointer fornisce i metodi: skipbytes(int n) fa avanzare il file pointer di n byte seek(long pos) imposta il file pointer alla posizione pos getfilepointer() restituisce il valore del file pointer
La classe System La classe System fornisce una interfaccia alle risorse del sistema; Implementa lo standard input, output ed error; Le sue variabili e i suoi metodi sono statici (non può essere istanziata) e vi si può accedere solo tramite dot-notation System.<variabile>; System.<metodo>;
La classe System Variabili in out err Standard input. Variabile di tipo InputStream Standard output. Variabile di tipo PrintStream Standard err. Variabile di tipo PrintStream Metodi currenttimemillis() fornisce in ms il tempo di sistema dal 1 Gennaio 1970 setin, setout, seterr standard input, output ed error riassegnano rispettivamente exit(int i) exit dall interprete java con return code = i
Domande??