• Non ci sono risultati.

Java I/O Java I/O

N/A
N/A
Protected

Academic year: 2021

Condividi "Java I/O Java I/O"

Copied!
62
0
0

Testo completo

(1)

Java I/O Java I/O

Corso di Programmazione Corso di Programmazione CdS:

CdS: Informatica e Tecnologie Informatica e Tecnologie per la Produzione di Software per la Produzione di Software Nicola Fanizzi Nicola Fanizzi

fanizzi@di.uniba.it

fanizzi@di.uniba.it

(2)

2 2

Introduzione Introduzione

 Spesso un programma deve acquisire dati Spesso un programma deve acquisire dati da una

da una sorgente sorgente o inviare informazioni a o inviare informazioni a una una destinazione destinazione (esterne) (esterne)

 L’informazione può essere di ogni tipo: L’informazione può essere di ogni tipo:

caratteri caratteri

immagini immagini

suoni suoni

oggetti oggetti

 Librerie Librerie java.io java.io (e la nuova (e la nuova java.nio java.nio ) )

(3)

3 3

Classe

Classe File File

Serve per ottenere informazioni riguardo un file Serve per ottenere informazioni riguardo un file

NB: Creare un oggetto di tipo NB: Creare un oggetto di tipo FileFile non significanon significa creare un file fisico creare un file fisico Costruttori

Costruttori

File(String percorso)File(String percorso)

Crea un oggetto di tipo

Crea un oggetto di tipo FileFile a partire da una stringa (il a partire da una stringa (il percorsopercorso))

File(File dir, String nome)File(File dir, String nome)

Crea un oggetto di tipo

Crea un oggetto di tipo FileFile denominato denominato nomenome a partire dalla directory dir a partire dalla directory dir (descritta tramite un oggetto di tipo

(descritta tramite un oggetto di tipo FileFile))

File(String dir, String nome)File(String dir, String nome)

Crea un oggetto di tipo

Crea un oggetto di tipo FileFile denominato denominato nomenome a partire dalla directory dir a partire dalla directory dir (descritta tramite una stringa)

(descritta tramite una stringa)

(4)

4 4

Esempio Esempio

Uso di

Uso di File File

1.1. import java.io.File;import java.io.File;

2.

2.

3.3. public class FileInfo {public class FileInfo {

4.4. public static void main(String[] args)public static void main(String[] args)

5.5. throws java.io.IOException { throws java.io.IOException {

6.6. File f = new File("FileInfo.class"); File f = new File("FileInfo.class");

7.

7. System.out.println(f.exists()); System.out.println(f.exists());

8.8. System.out.println(f.isFile()); System.out.println(f.isFile());

9.9. System.out.println(f.isDirectory()); System.out.println(f.isDirectory());

10.

10. System.out.println(f.canRead()); System.out.println(f.canRead());

11.11. System.out.println(f.canWrite()); System.out.println(f.canWrite());

12.12. System.out.println(f.length()); System.out.println(f.length());

13.13. System.out.println(f.getAbsolutePath()); System.out.println(f.getAbsolutePath());

14.14. System.out.println(f.getName()); System.out.println(f.getName());

15.

15. System.out.println(f.getParent()); System.out.println(f.getParent());

16.16. File p = new File(f.getAbsolutePath()); File p = new File(f.getAbsolutePath());

17.17. System.out.println(p.getParent()); System.out.println(p.getParent());

18.18. } }

truetrue truetrue false false truetrue truetrue 919919

C:\Prove\FileInfo .class C:\Prove\FileInfo .class

FileInfo.class FileInfo.class nullnull

C:\Prove C:\Prove

(5)

5 5

File File

Metodi Metodi

Metodi Utili Metodi Utili

boolean delete()boolean delete()

Cancella il file o la directory specificata Cancella il file o la directory specificata

boolean mkdir()boolean mkdir()

Crea la directory Crea la directory

boolean renameTo(File dest)boolean renameTo(File dest)

Cambia nome al file Cambia nome al file

String[] list()String[] list()

Restituisce un vettore con i nomi dei file della directory dall’oggetto

Restituisce un vettore con i nomi dei file della directory dall’oggetto FileFile

File[] listFiles()File[] listFiles()

Restituisce un vettore con gli oggetti

Restituisce un vettore con gli oggetti FileFile che fanno file della directory che fanno file della directory riferita dall’oggetto

riferita dall’oggetto FileFile

(6)

6 6

Esempio Esempio

Listato Directory Listato Directory

1.1.

import java.io.File; import java.io.File;

2.2.

3.3.

public class Lista { public class Lista {

4.4.

5.5.

public static void main(String[] args) { public static void main(String[] args) {

6.6.

File workingDir = new File("."); File workingDir = new File(".");

7.7.

String[] lista = workingDir.list(); String[] lista = workingDir.list();

8.8.

for(int i=0; i<lista.length; i++) for(int i=0; i<lista.length; i++)

9.

9.

System.out.println(lista[i]); System.out.println(lista[i]);

10.10.

} }

11.11.

} }

Lista.javaLista.classLista.javaLista.class Copy.java Copy.java Copy.class Copy.class FileInfo.java FileInfo.java FileInfo.class FileInfo.class

(7)

7 7

Input / Output Input / Output

sorgente

sorgente applicazioneapplicazione destinazionedestinazione

scrittura scrittura

lettu

ra lettu

ra

(8)

8 8

Flussi di Input / Output Flussi di Input / Output

Per acquisire dati, una applicazione deve aprire uno stream (o flusso) associato alla sorgente di

informazione (file, socket, memoria, ecc.) e leggere l’informazione sequenzialmente da esso

Un programma può inviare verso una destinazione esterna dei dati aprendo uno stream associato alla destinazione e scrivendovi in modo sequenziale i dati

Indipendentemente dall’origine e dalla destinazione dei

dati e dal loro tipo, gli algoritmi per leggere e scrivere

sequenzialmente dei dati sono molto simili

(9)

9 9

Lettura / Scrittura Sequenziale Lettura / Scrittura Sequenziale

Lettura Lettura

Apertura dello stream Apertura dello stream Finché ci sono dati da Finché ci sono dati da

leggere leggere

lettura dato lettura dato

Chiusura dello stream Chiusura dello stream

Scrittura Scrittura

Apertura dello stream Apertura dello stream Finché ci sono dati da Finché ci sono dati da

scrivere scrivere

scrittura dato scrittura dato

Chiusura dello stream

Chiusura dello stream

(10)

10 10

Tipi di Flusso Tipi di Flusso

Le classi di gestione degli stream sono di due tipi in base Le classi di gestione degli stream sono di due tipi in base ai dati su cui operano:

ai dati su cui operano: caratteri / byte caratteri / byte

Stream di Caratteri Stream di Caratteri (Unicode 16bit)(Unicode 16bit) classi

classi Reader e Reader e WriterWriter e derivate e derivate

Stream di Byte Stream di Byte (8bit) (8bit) classi

classi InputStreamInputStream e OutputStream e OutputStream e derivate e derivate

Esistono varie sottoclassi che consentono la Esistono varie sottoclassi che consentono la lettura/scrittura su file come, ad es.:

lettura/scrittura su file come, ad es.:

FileReaderFileReader e FileWriter e FileWriter ( (testotesto))

FileInputStream e FileInputStream e FileOutputStreamFileOutputStream ( (binari)binari)

Possono sollevare eccezioni della classe IOException Possono sollevare eccezioni della classe IOException (e sue derivate)

(e sue derivate)

(11)

11 11

Tipi di Flusso Tipi di Flusso

Le classi astratte Filter-Le classi astratte Filter- rappresentano i flussi ai quali è applicato rappresentano i flussi ai quali è applicato una forma di filtraggio man mano che essi vengono letti/scritti

una forma di filtraggio man mano che essi vengono letti/scritti

I flussi I flussi Buffered-Buffered- aggiungono ad ogni flusso un buffer per aggiungono ad ogni flusso un buffer per aumentare l'efficienza

aumentare l'efficienza

I flussi I flussi Piped- vengono progettati a coppie in modo da poterle Piped- vengono progettati a coppie in modo da poterle collegare

collegare

I flussi I flussi di memoriadi memoria permettono di utilizzare strutture dati presenti in permettono di utilizzare strutture dati presenti in memoria come sorgenti/destinazioni di informazione

memoria come sorgenti/destinazioni di informazione

I flussi I flussi Print-Print- permettono di controllare la formattazione permettono di controllare la formattazione dell'output

dell'output

Altri flussi: utili alla costruzione di parser Altri flussi: utili alla costruzione di parser

PushbackInputStreamPushbackInputStream

LineNumberInputStreamLineNumberInputStream

StreamTokenizerStreamTokenizer

(12)

12 12

Classi dei Flussi di Byte Classi dei Flussi di Byte

frammento frammento

InputStream InputStream

FileInputStream FileInputStream PipedInputStream PipedInputStream FilterInputStream FilterInputStream ByteArrayInputStream ByteArrayInputStream SequenceInputStream SequenceInputStream StringBufferInputStream StringBufferInputStream

ObjectInputStream ObjectInputStream

LineNumberInputStream LineNumberInputStream

DataInputStream DataInputStream BufferedInputStream BufferedInputStream PushbackInputStream PushbackInputStream

gerarchia analoga gerarchia analoga per per OutputStreamOutputStream

(13)

13 13

InputStream InputStream

abstract int read() abstract int read()

legge il prossimo byte di dati dallo streamlegge il prossimo byte di dati dallo stream

int read(byte[] b) int read(byte[] b)

legge i prossimi byte di dati dallo stream salvandoli nel buffer array legge i prossimi byte di dati dallo stream salvandoli nel buffer array bb

int read(byte[] b, int off, int len) int read(byte[] b, int off, int len)

legge lenlegge len byte dallo stream salvandoli nell'array b byte dallo stream salvandoli nell'array b a partire da off a partire da off

void reset() void reset()

riposiziona lo stream all’ultima marcatura provocata da riposiziona lo stream all’ultima marcatura provocata da mark()mark()

long skip(long n) long skip(long n)

salta i prossimi n byte letti dallo streamsalta i prossimi n byte letti dallo stream

int available() int available()

restituisce il numero di byte leggibili da questo streamrestituisce il numero di byte leggibili da questo stream

void mark(int readlimit) void mark(int readlimit)

marca la posizione correntemarca la posizione corrente

boolean markSupported() boolean markSupported()

Testa se lo stream supporta i metodi markTesta se lo stream supporta i metodi mark e reset e reset

void close() void close()

(14)

14 14

Esempio Esempio

Conteggio Byte Letti da Stream Conteggio Byte Letti da Stream

1.1. import java.io.*;import java.io.*;

2.2.

3.3. public class ContaByte {public class ContaByte {

4.4. public static void main(String[] args) public static void main(String[] args) throws IOException {

throws IOException {

5.5. InputStream in = new FileInputStream(args InputStream in = new FileInputStream(args [0]);

[0]);

6.6. int totale; int totale;

7.7. while (in.read() != -1) while (in.read() != -1)

8.8. ++totale; ++totale;

9.9. System.out.pritln(“Letti: ”+totale+” byte”); System.out.pritln(“Letti: ”+totale+” byte”);

10.10. in.close(); in.close();

11.

11. } }

12.12.}}

(15)

15 15

OutputStream OutputStream

abstract void write(int b) abstract void write(int b)

scrive il byte specificato sullo streamscrive il byte specificato sullo stream

void write(byte[] b) void write(byte[] b)

scrive i scrive i b.lengthb.length byte dell'array specificato sullo stream byte dell'array specificato sullo stream

void write (byte[] b, int off, int len) void write (byte[] b, int off, int len)

scrive sullo stream scrive sullo stream lenlen byte dell'array specificato iniziando da byte dell'array specificato iniziando da offset

offset

void flush() void flush()

svuota lo stream, forzando la scrittura dei byte ancora nel buffersvuota lo stream, forzando la scrittura dei byte ancora nel buffer

void close() void close()

chiude lo stream rilasciando le risorse associatechiude lo stream rilasciando le risorse associate

(16)

16 16

Classi dei Flussi di Caratteri Classi dei Flussi di Caratteri

frammento frammento

Reader Reader

BufferedReader

BufferedReader LineNumberReaderLineNumberReader CharArrayReader

CharArrayReader InputStreamReader InputStreamReader

FilterReader FilterReader PipedReader PipedReader StringReader StringReader

FileReader FileReader PushBackReader PushBackReader

gerarchia analoga gerarchia analoga perper WriterWriter

(17)

17 17

Reader Reader

abstract void close() abstract void close()

chiude il flussochiude il flusso

void mark(int readAheadLimit) void mark(int readAheadLimit)

marca la posizione correntemarca la posizione corrente boolean markSupported() boolean markSupported()

dice se lo stream supporta la marcaturadice se lo stream supporta la marcatura int read()

int read()

legge un caratterelegge un carattere int read(char[] cbuf) int read(char[] cbuf)

legge caratteri in un arraylegge caratteri in un array

abstract int read(char[] cbuf, int off, int len) abstract int read(char[] cbuf, int off, int len)

legge caratteri in una porzione di arraylegge caratteri in una porzione di array int read(CharBuffer target)

int read(CharBuffer target)

cerca di leggere caratteri nel buffer di caratteri specificatocerca di leggere caratteri nel buffer di caratteri specificato boolean ready()

boolean ready()

dice se lo stream è pronto per nuove letturedice se lo stream è pronto per nuove letture void reset()

void reset()

resetta lo streamresetta lo stream long skip(long n) long skip(long n)

salta n caratterisalta n caratteri

(18)

18 18

Esempio Esempio

Lettura da

Lettura da Reader Reader

1.1. import java.io.*;import java.io.*;

2.

2.

3.3. public class ContaSpazi {public class ContaSpazi {

4.4. public static void main(String[] args)public static void main(String[] args) throws IOException {

throws IOException {

5.5. Reader in = new FileReader(args[0]); Reader in = new FileReader(args[0]);

6.6. int totale = 0, spazi = 0, ch; int totale = 0, spazi = 0, ch;

7.

7.

8.8. while (in.read() != -1) { while (in.read() != -1) {

9.9. ++totale;++totale;

10.10. if (Character.isWhiteSpace((char)ch)) if (Character.isWhiteSpace((char)ch))

11.11. ++spazi; ++spazi;

12.

12. } }

13.13. System.out.pritln("spazi:"+spazi+“/”+totale); System.out.pritln("spazi:"+spazi+“/”+totale);

14.14. in.close(); in.close();

15.

15. } }

16.16. }}

(19)

19 19

Writer Writer

Writer append(char c) Writer append(char c)

aggiunge il carattere specificato allo streamaggiunge il carattere specificato allo stream Writer append(CharSequence csq)

Writer append(CharSequence csq)

aggiunge i caratteri specificati nella sequenza allo streamaggiunge i caratteri specificati nella sequenza allo stream

Writer append(CharSequence csq, int start, int end) Writer append(CharSequence csq, int start, int end)

aggiunge allo stream i caratteri specificati nella sotto-sequenzaaggiunge allo stream i caratteri specificati nella sotto-sequenza abstract void close()

abstract void close()

chiude lo stream dopo lo svuotamentochiude lo stream dopo lo svuotamento abstract void flush()

abstract void flush()

svuota lo streamsvuota lo stream

void write(char[] cbuf) void write(char[] cbuf)

scrive un array di caratteri scrive un array di caratteri

abstract void write(char[] cbuf, int off, int len) abstract void write(char[] cbuf, int off, int len)

scrive una porzione di un array di caratteri scrive una porzione di un array di caratteri void write(int c)

void write(int c)

scrive un caratterescrive un carattere

void write(String str) void write(String str)

scrive una stringascrive una stringa

void write(String str, int off, int len) void write(String str, int off, int len)

scrive una porzione di una stringascrive una porzione di una stringa

(20)

20 20

InputStreamReader InputStreamReader OutputStreamWriter OutputStreamWriter

Permettono la conversione da flusso caratteri Unicode a Permettono la conversione da flusso caratteri Unicode a flusso di byte e viceversa:

flusso di byte e viceversa:

InputStreamReader(InputStream in) InputStreamReader(InputStream in)

la sorgente la sorgente in fornisce un flusso di byte che viene convertito in in fornisce un flusso di byte che viene convertito in un flusso di caratteri

un flusso di caratteri

char read() char read()

legge il prossimo carattere dal flusso di byte collegatolegge il prossimo carattere dal flusso di byte collegato

OutputStreamWriter(OutputStream out) OutputStreamWriter(OutputStream out)

fornisce la conversione di un flusso di caratteri in un flusso di fornisce la conversione di un flusso di caratteri in un flusso di byte di destinazione

byte di destinazione outout

write(char c) write(char c)

scrive il carattere sul flusso di byte collegatoscrive il carattere sul flusso di byte collegato

(21)

21 21

FileReader FileReader

public FileReader(String nomeFile) public FileReader(String nomeFile)

throws FileNotFoundException throws FileNotFoundException Crea un nuovo

Crea un nuovo FileReader FileReader , per leggere dal file il , per leggere dal file il cui nome viene passato

cui nome viene passato

Parametri Parametri : :

nomeFile nomeFile

nome del file da leggere nome del file da leggere

Eccezioni: Eccezioni:

FileNotFoundException FileNotFoundException

se il file specificato non esiste

se il file specificato non esiste

(22)

22 22

Lettura Lettura

Per leggere caratteriPer leggere caratteri da un file si crea un’istanza da un file si crea un’istanza FileReaderFileReader FileReader(String nomeFile)

FileReader(String nomeFile) esempio

esempio::

FileReader myReader = new FileReader(“input.txt”);

FileReader myReader = new FileReader(“input.txt”);

Per leggere sequenze di bytePer leggere sequenze di byte da un file si crea un’istanza di da un file si crea un’istanza di FileInputStream

FileInputStream

FileInputStream(String nomeFile) FileInputStream(String nomeFile) esempio

esempio::

FileInputStream myInputStream = FileInputStream myInputStream =

new FileInputStream(“input.txt”);

new FileInputStream(“input.txt”);

In entrambi i casi si utilizza il metodo int read()In entrambi i casi si utilizza il metodo int read() che legge un carattere / che legge un carattere / byte per volta e restituisce un valore di tipo

byte per volta e restituisce un valore di tipo intint che corrisponde al codice che corrisponde al codice del carattere / byte letto oppure

del carattere / byte letto oppure –1–1 se non ci sono più dati da leggere se non ci sono più dati da leggere

(23)

23 23

Copia di un File di Caratteri Copia di un File di Caratteri

1.1. import java.io.*;import java.io.*;

2.2.

3.3. public class CopiaCaratteri {public class CopiaCaratteri {

4.

4. public static void main(String[] args) public static void main(String[] args)

5.

5. throws IOException { throws IOException {

6.

6. FileReader in = new FileReader(args[0]); FileReader in = new FileReader(args[0]);

7.7. FileWriter out = new FileWriter(args[1]); FileWriter out = new FileWriter(args[1]);

8.8. int c; int c;

9.9.

10.10. while ((c = in.read()) != -1)while ((c = in.read()) != -1)

11.

11. out.write(c) ; out.write(c) ;

12.12.

13.13. in.close(); in.close();

14.14. out.close(); out.close();

15.15. } }

16.16. }}

(24)

24 24

Copia di un File di Byte Copia di un File di Byte

1.1. import java.io.*;import java.io.*;

2.2.

3.3. public class CopiaByte {public class CopiaByte {

4.

4. public static void main(String[] args)public static void main(String[] args)

5.

5. throws IOException { throws IOException {

6.

6. FileInputStream in = new FileInputStream(args[0]); FileInputStream in = new FileInputStream(args[0]);

7.7. FileOutputStream out = new FileOutputStream(args[1]); FileOutputStream out = new FileOutputStream(args[1]);

8.8. int c; int c;

9.9.

10.10. while ((c = in.read()) != -1)while ((c = in.read()) != -1)

11.

11. out.write(c) ; out.write(c) ;

12.12.

13.13. in.close(); in.close();

14.14. out.close(); out.close();

15.15. } }

16.16. }}

(25)

25 25

Stream con Buffer Stream con Buffer

migliora le performance dell'I/O migliora le performance dell'I/O

copia ogni input/output da/verso una regione di copia ogni input/output da/verso una regione di memoria detta

memoria detta buffer buffer

lettura/scrittura dell'intero buffer su disco in lettura/scrittura dell'intero buffer su disco in un'unica soluzione

un'unica soluzione

un'unica sessione di accesso a disco impiega meno di un'unica sessione di accesso a disco impiega meno di tanti piccoli accessi

tanti piccoli accessi

BufferedOutputStream BufferedOutputStream file output bufferizzato

file output bufferizzato

BufferedInputStream BufferedInputStream file input bufferizzato

file input bufferizzato

(26)

26 26

BufferedReader BufferedReader

Conente di gestire un flusso tramite un buffer (area di memoria)Conente di gestire un flusso tramite un buffer (area di memoria)

I dati vengono letti a blocchi dal flusso e memorizzati in un buffer.I dati vengono letti a blocchi dal flusso e memorizzati in un buffer.

Quando viene richiesto un nuovo dato, Quando viene richiesto un nuovo dato,

prima si verifica la sua disponibilità nel buffer e, prima si verifica la sua disponibilità nel buffer e,

se non disponibile in memoria, si legge un nuovo blocco dal flusso se non disponibile in memoria, si legge un nuovo blocco dal flusso

Costruttori disponibiliCostruttori disponibili

BufferedReader(Reader in) BufferedReader(Reader in) Crea un oggetto

Crea un oggetto BufferedReaderBufferedReader a partire da un oggetto Reader a partire da un oggetto Reader

Metodi disponibiliMetodi disponibili in aggiunta a quelli di in aggiunta a quelli di ReaderReader String readLine()

String readLine()

Legge una riga e la restituisce sotto forma di stringa Legge una riga e la restituisce sotto forma di stringa

(27)

27 27

BufferedReader BufferedReader

Lettura Lettura

FileReader file = new FileReader(“nome-file”);

FileReader file = new FileReader(“nome-file”);

BufferedReader in = new BufferedReader(file);

BufferedReader in = new BufferedReader(file);

oppure oppure

BufferedReader in = new BufferedReader(new BufferedReader in = new BufferedReader(new

FileReader(“nome-file”));

FileReader(“nome-file”));

in.readLine();

in.readLine();

(28)

28 28

BufferedReader BufferedReader

Esempio Esempio

1.1. import java.io.*;import java.io.*;

2.2.

3.3. public class TestLettura {public class TestLettura {

4.

4. public static void main(String[] args) public static void main(String[] args)

5.5. throws IOException {throws IOException {

6.

6. FileReader file = new FileReader(args[0]);FileReader file = new FileReader(args[0]);

7.7. BufferedReader in = new BufferedReader(file);BufferedReader in = new BufferedReader(file);

8.8. String linea; String linea;

9.9. while ((linea = in.readLine()) != null) while ((linea = in.readLine()) != null)

10.10. System.out.println(linea); System.out.println(linea);

11.11.

12.12. in.close(); in.close();

13.13. } }

14.14.}}

(29)

29 29

Classe

Classe PrintWriter PrintWriter

La classe La classe PrintWriter PrintWriter mette a disposizione i metodi mette a disposizione i metodi

void print()void print()

void println()void println()

utilizzabili con qualunque tipo di parametro utilizzabili con qualunque tipo di parametro

(stringa, intero, reale, ecc.) (stringa, intero, reale, ecc.)

Si può creare un nuovo oggetto PrintWriter Si può creare un nuovo oggetto PrintWriter a partire a partire da un

da un Writer Writer , in particolare da un FileWriter , in particolare da un FileWriter esempio

esempio : :

PrintWriter f = new PrintWriter(

PrintWriter f = new PrintWriter(

new FileWriter(“nome-file”));

new FileWriter(“nome-file”));

(30)

30 30 Scrittura su

Scrittura su PrintWriter PrintWriter

1.1. import java.io.*;import java.io.*;

2.2.

3.

3. public class TestCopia {public class TestCopia {

4.

4. public static void main(String[] args)public static void main(String[] args)

5.5. throws IOException {throws IOException {

6.6. FileReader file = new FileReader(args[0]); FileReader file = new FileReader(args[0]);

7.7. BufferedReader in = new BufferedReader(file); BufferedReader in = new BufferedReader(file);

8.8. String line; String line;

9.9. PrintWriter out = PrintWriter out =

new PrintWriter (new FileWriter(args[1]));

new PrintWriter (new FileWriter(args[1]));

10.

10. while ((line = in.readLine()) != null) while ((line = in.readLine()) != null)

11.

11. out.println(line); out.println(line);

12.12.

13.13. in.close(); in.close();

14.14. out.close(); out.close();

15.15. } }

16.16. }}

(31)

31 31

Classe

Classe PrintStream PrintStream

La classe PrintStream La classe PrintStream mette a disposizione i metodi mette a disposizione i metodi void print()

void print() e void println() e void println() utilizzabili con utilizzabili con qualunque tipo di parametro (stringa, intero, reale, ecc.) qualunque tipo di parametro (stringa, intero, reale, ecc.)

Si può creare un nuovo oggetto Si può creare un nuovo oggetto PrintStream PrintStream a partire a partire da un

da un OutputStream OutputStream , in particolare da un , in particolare da un FileOutputStream

FileOutputStream PrintStream f = PrintStream f =

new PrintStream(new

new PrintStream(new FileOutputStream FileOutputStream (“file.dat”));

(“file.dat”));

System.out System.out e System.err e System.err sono di tipo sono di tipo PrintStream

PrintStream

(32)

32 32 Scrittura su

Scrittura su PrintStream PrintStream

1.1. import java.io.*;import java.io.*;

2.2.

3.

3. public class TestCopia {public class TestCopia {

4.

4. public static void main(String[] args) public static void main(String[] args)

5.5. throws IOException { throws IOException {

6.6. FileReader file = new FileReader(args[0]); FileReader file = new FileReader(args[0]);

7.7. BufferedReader in = new BufferedReader(file); BufferedReader in = new BufferedReader(file);

8.8. String line; String line;

9.9. PrintStream out = PrintStream out =

new PrintStream(new FileOutputStream(args[1]));

new PrintStream(new FileOutputStream(args[1]));

10.

10. while ((line = in.readLine()) != null) while ((line = in.readLine()) != null)

11.

11. out.println(line); out.println(line);

12.12.

13.13. in.close(); in.close();

14.14. out.close(); out.close();

15.15. } }

16.16. }}

(33)

33 33

Esempio Esempio

Uso degli

Uso degli Stream Stream

1.1. import java.io.*;import java.io.*;

2.

2. public class TestLetturaVettore {public class TestLetturaVettore {

3.3. public static void main(String[] args) public static void main(String[] args)

4.4. throws IOException {throws IOException {

5.5. if (args.length < 1) System.exit(-1); if (args.length < 1) System.exit(-1);

6.6. FileReader myFile = new FileReader(args[0]); FileReader myFile = new FileReader(args[0]);

7.

7. BufferedReader in = new BufferedReader(myFile); BufferedReader in = new BufferedReader(myFile);

8.8. int i = 0, v[] = new int[100], dim; int i = 0, v[] = new int[100], dim;

9.9. String linea; String linea;

10.

10. while (i < 100 && (linea = in.readLine()) != null){ while (i < 100 && (linea = in.readLine()) != null){

11.11. v[i] = Integer.parseInt(linea); v[i] = Integer.parseInt(linea);

12.12. i++; i++;

13.13. } }

14.14. dim = i; dim = i;

15.

15. for(i=0; i<dim; i++) for(i=0; i<dim; i++)

16.16. System.out.println(v[i]); System.out.println(v[i]);

17.17. in.close(); in.close();

18.18. } }

(34)

34 34

Esempio Esempio

Uso di

Uso di Stream Stream

1.1. public class VettoreInt {public class VettoreInt {

2.2. private int v[] = new int[100], dim; private int v[] = new int[100], dim;

3.

3.

4.

4. public void leggi(String nomeFile) public void leggi(String nomeFile) throws IOException {

throws IOException {

5.

5. FileReader file = new FileReader (nomeFile); FileReader file = new FileReader (nomeFile);

6.6. BufferedReader in = new BufferedReader(file); BufferedReader in = new BufferedReader(file);

7.7. int i = 0; int i = 0;

8.8. String line; String line;

9.9. while (i < 100 && (line = in.readLine()) != null){while (i < 100 && (line = in.readLine()) != null){

10.

10. v[i] = Integer.parseInt(line); v[i] = Integer.parseInt(line);

11.

11. i++; i++;

12.12. } }

13.13. dim = i; dim = i;

14.14. in.close(); in.close();

15.15. } // fine metodo leggi } // fine metodo leggi

16.16.

(35)

35 35

Esempio Esempio

Uso di

Uso di Stream Stream

1.1. public void stampa( String nomeFile) public void stampa( String nomeFile) throws IOException {

throws IOException {

2.2. PrintWriter out = PrintWriter out =

new PrintWriter(new FileWriter (nomeFile));

new PrintWriter(new FileWriter (nomeFile));

3.3. for(int i=0; i<dim; i++) for(int i=0; i<dim; i++)

4.

4. out.println(v[i]); out.println(v[i]);

5.5. out.close(); out.close();

6.6. } // fine metodo stampa} // fine metodo stampa

7.7.

8.8. public static void main(String[] args) public static void main(String[] args) throws IOException {

throws IOException {

9.

9. if(args.length < 2) { if(args.length < 2) {

10.10. System.out.println("errore"); System.out.println("errore");

11.11. System.exit (-1);System.exit (-1);

12.12. } }

13.13. VettoreInt myData = new VettoreInt (); VettoreInt myData = new VettoreInt ();

14.

14. myData.leggi(args[0]); myData.leggi(args[0]);

15.15. myData.stampa(args[1]); myData.stampa(args[1]);

16.16. } // fine metodo main } // fine metodo main

(36)

36 36

Classe

Classe System System

Consente l’accesso a risorse del sistema come lo standard Consente l’accesso a risorse del sistema come lo standard output, allo standard input, ecc.

output, allo standard input, ecc.

Fornisce Fornisce

stream instream in (di tipo InputStream (di tipo InputStream) associato allo standard input, ) associato allo standard input,

stream outstream out (di tipo (di tipo PrintStreamPrintStream) associato all’output e ) associato all’output e

stream errstream err associato allo standard error. associato allo standard error.

Inoltre contiene alcuni metodi che svolgono diversi Inoltre contiene alcuni metodi che svolgono diversi compiti, ad esempio:

compiti, ad esempio:

metodo exit(int status)metodo exit(int status) interrompe l’interpretazione del interrompe l’interpretazione del programma, ecc.

programma, ecc.

(37)

37 37

File di Record File di Record

Record Record

composti da diversi campi composti da diversi campi

implementabili come oggetti Java implementabili come oggetti Java

Un Un file file può essere visto come un gruppo di può essere visto come un gruppo di record correlati

record correlati

Un campo di ogni record è la chiave Un campo di ogni record è la chiave

file sequenziale file sequenziale

record immagazzinati in ordine di chiave record immagazzinati in ordine di chiave

File di record in Java File di record in Java

Java non impone alcuna struttura ai file Java non impone alcuna struttura ai file

Il programmatore dà una struttura ai file a seconda Il programmatore dà una struttura ai file a seconda dell'applicazione

dell'applicazione

(38)

38 38

Randy

Randy RedRed

11

01001010 01001010 JudyJudy

JudyJudy GreenGreen Sally

Sally BlackBlack Tom

Tom BlueBlue JudyJudy GreenGreen Iris

Iris OrangeOrange

File File

Record Record Campo

Campo Byte Byte

Bit Bit

Record Record

codice codice ASCII ASCII JJ

(39)

39 39

File e Flussi File e Flussi

 Java vede i file come flussi di byte Java vede i file come flussi di byte

 Un file termina con un marcatore di end- Un file termina con un marcatore di end- of-file

of-file

File come flussi di byte associati ad oggetto File come flussi di byte associati ad oggetto

 Elaborazione file con le classi di Elaborazione file con le classi di java.io java.io

FileInputStream FileInputStream

FileOutputStream FileOutputStream

FileReader FileReader

FileWriter FileWriter

(40)

40 40

File ad Accesso Sequenziale File ad Accesso Sequenziale

Aggiornamento Aggiornamento

 Difficile aggiornare file ad accesso Difficile aggiornare file ad accesso sequenziale

sequenziale

L'intero file deve essere riscritto per cambiare L'intero file deve essere riscritto per cambiare un singolo campo

un singolo campo

Accettabile solo quando tanti record devono Accettabile solo quando tanti record devono essere aggiornati alla volta

essere aggiornati alla volta

(41)

41 41

File ad Accesso Casuale File ad Accesso Casuale

Applicazioni con accesso in tempo reale Applicazioni con accesso in tempo reale

Record da collocare immediatamente Record da collocare immediatamente

Sistemi a transazioni: richiedono tempi rapidi Sistemi a transazioni: richiedono tempi rapidi d'accesso

d'accesso

File ad File ad accesso casuale accesso casuale ( ( random random ) )

Si accede a record individuali in modo diretto e rapido Si accede a record individuali in modo diretto e rapido

lunghezza fissa per ogni record lunghezza fissa per ogni record

facilità di calcolo delle posizioni facilità di calcolo delle posizioni

inserimento senza distruzione degli altri dati del file inserimento senza distruzione degli altri dati del file

(42)

42 42

File ad Acceso Casuale File ad Acceso Casuale

Schema Schema

100100

bytebyte 100100

bytebyte 100100

bytebyte 100100

bytebyte 100100

bytebyte 100100 bytebyte

00 100100 200200 300300 400400 500500

offset offset in in bytebyte

(43)

43 43

RandomAccessFile RandomAccessFile

RandomAccessFile(String n, String m) throws FileNotFoundException

prima stringa: nome di file fisico

seconda: modo di accesso

lettura: modo read “r”

Lancio IOException se in questa modalità non esiste il file o si tratta di una directory

lettura e scrittura: modo “rw”.

In modalità “rw” se non esiste lo crea, se esiste si predispone per le operazioni di lettura o scrittura ponendo il puntatore all’inizio

simile a DataInputStream simile a DataInputStream e e DataOutputstream DataOutputstream

legge/scrive dati in locazioni specificate dal puntatore di legge/scrive dati in locazioni specificate dal puntatore di posizione nel file

posizione nel file

Manipola i dati come fossero di tipi primitiviManipola i dati come fossero di tipi primitivi

Normalmente si scrive su file un oggetto per voltaNormalmente si scrive su file un oggetto per volta

(44)

44 44

RandomAccessFile

Metodi

long length()

Restituisce il numero di byte del file.

void setLength(long newLength)

Setta la lunghezza del file.

se il file e più corto lo amplia, se più lungo lo tronca.

In caso di riscrittura su un file esistente è necessario utilizzare questo metodo al termine della scrittura per inserire l’eof.

Nella forma setLength(getFilePointer())

long getFilePointer()

Restituisce la posizione in byte del puntatore attuale

void seek(long pos)

Porta il puntatore sul byte di posizione indicata

(45)

45 45

RandomAccessFile

...

void close()

Chiude il file e libera la memoria heap

long readLong()

double readDouble()

Legge un dato e trasla il puntatore di una quantità pari al numero di byte binari occupati dal tipo di dato. La lettura produce un

EOFException quando incontra il termine del File

String readLine()

in scrittura è a carico del programmatore aggiungere un carattere di fine linea ‘\r’ o ‘\n’ o entrambi.

Legge tutti i caratteri fino al marcatore di fine linea ‘\r’ o ‘\n’

Se il puntatore è a EOF la stringa acquisita è null. In ogni caso si produce un EOFException

(46)

46 46

RandomAccessFile

...

void writeInt(int) void writeLong(long)

void writeDouble(double) void writeFloat(float) void writeByte(int)

void writeBoolean(boolean) void writeChar(int)

Scrive il dato indicato e trasla il puntatore.

void writeBytes(String) void writeChars(String)

Scrive tutti i byte di una stringa in formato dipendente dalla macchina.

(47)

47 47

Persistenza degli Oggetti Persistenza degli Oggetti

Possibilità di immagazzinare e recuperare oggetti anche Possibilità di immagazzinare e recuperare oggetti anche complessi

complessi

Gli oggetti vengono immagazzinati in uno stream Gli oggetti vengono immagazzinati in uno stream

Bisogna decidere un certo protocollo di memorizzazione. Bisogna decidere un certo protocollo di memorizzazione.

Si codificano tali caratteristiche Si codificano tali caratteristiche

usando le stringhe ed usando numeriusando le stringhe ed usando numeri

Le cose sono difficili se la struttura dati è complessa: Le cose sono difficili se la struttura dati è complessa:

Occorre implementare due metodi di conversione della struttura Occorre implementare due metodi di conversione della struttura in forma sequenziale, salvarla per poi ripristinarla, ricostruendo in forma sequenziale, salvarla per poi ripristinarla, ricostruendo

la struttura originaria la struttura originaria

Due soluzioni: Due soluzioni:

serializzazioneserializzazione

esternalizzazioneesternalizzazione

(48)

48 48

Serializzazione Serializzazione

Serializable Serializable

Interfaccia che deve essere realizzata dagli oggetti da serializzareInterfaccia che deve essere realizzata dagli oggetti da serializzare

L’oggetto serializzato contiene tutta l’informazione necessaria per L’oggetto serializzato contiene tutta l’informazione necessaria per

verificare la sua classeverificare la sua classe

per ricostruirne l’istanzaper ricostruirne l’istanza

L’operazione di memorizzazione di oggetti in un flusso viene detta Serializzazione

Ogni oggetto riceve un numero di serie:

Se lo stesso oggetto viene salvato due volte, la seconda volta ne viene salvato solo il numero di serie

Se in un flusso si incontra più volte lo stesso numero di serie, questi vengono interpretati come riferimenti allo stesso oggetto

(49)

49 49

Esternalizzazione Esternalizzazione

Externalizable Externalizable

Interfaccia che deve essere realizzata dagli oggetti da Interfaccia che deve essere realizzata dagli oggetti da

“esternalizzare”

“esternalizzare”

Realizza l’interfaccia Realizza l’interfaccia Serializable Serializable ... ...

... ma l’oggetto esternalizzabile è l’unico responsabile del ... ma l’oggetto esternalizzabile è l’unico responsabile del formato esterno dei suoi contenuti

formato esterno dei suoi contenuti

(50)

50 50

Interfaccia

Interfaccia Serializable Serializable

Se un oggetto implementa l’interfaccia Se un oggetto implementa l’interfaccia Serializable Serializable , , esso è

esso è serializzabile serializzabile cioè può essere reso persistente e poi cioè può essere reso persistente e poi ripristinato

ripristinato

La cosa importante è che l’oggetto ripristinato abbia le La cosa importante è che l’oggetto ripristinato abbia le stesse proprietà dell’oggetto salvato

stesse proprietà dell’oggetto salvato

possibilità di definire alcune proprietà come transientpossibilità di definire alcune proprietà come transient:: viene salvata l’istanza ma in fase di ripristino i suoi campi viene salvata l’istanza ma in fase di ripristino i suoi campi

assumono i loro valori di default assumono i loro valori di default

Supponendo di avere una classe di nome StrutturaSupponendo di avere una classe di nome Struttura, , per renderla serializzabile basterà scrivere:

per renderla serializzabile basterà scrivere:

public class Struttura public class Struttura

implements Serializable implements Serializable { { ... ...

} }

(51)

51 51

Serializzazione di Oggetti

ObjectOutput

Interfaccia: un contenitore in cui possono essere immagazzinati oggetti

writeObject(Object o)

writeInt(), writeFloat (), ...

flush()

ObjectOutputStream

Realizza l’interfaccia ObjectOutput

Costruita a partire da un OutputStream

ObjectInput ObjectInput

Interfaccia: un contenitore da cui possono essere recuperati

oggetti

Object readObject()

readInt(), readFloat (), ...

ObjectInputStream ObjectInputStream

Realizza l’interfaccia ObjectInput

Costruita a partire da un InputStream

(52)

52 52

Serializzazione Serializzazione

Esempio Esempio

public void scrivi () { public void scrivi () { try {try {

s = new ObjectOutputStream(new FileOutputStream("save.ser")); s = new ObjectOutputStream(new FileOutputStream("save.ser"));

s.writeObject(salvato); s.writeObject(salvato);

s.close(); s.close();

} catch (IOException ioe) { System.out.println} catch (IOException ioe) { System.out.println ("Errore:"+ioe.toString());

("Errore:"+ioe.toString());

}} }}

public void leggi () { public void leggi () { try { try {

s = new ObjectInputStream(new FileInputStream("save.ser"));

s = new ObjectInputStream(new FileInputStream("save.ser"));

salvato = (TipoSalvato)(s.readObject());

salvato = (TipoSalvato)(s.readObject());

s.close();

s.close();

} catch (IOException ioe) { } catch (IOException ioe) {

    System.out.println("Errore:"+ioe.toString());

    System.out.println("Errore:"+ioe.toString());

} } }}

(53)

53 53

Nuove API I/O di Java Nuove API I/O di Java

Buffer Buffer

Consolidamento delle operazioni di I/O Consolidamento delle operazioni di I/O

4 proprietà: 4 proprietà:

Capacity Capacity

Limit Limit

Position Position

Mark Mark

Operazioni di Operazioni di put put & & get get

Relative o assolute Relative o assolute

clear clear , , flip flip , , rewind rewind , , reset reset

(54)

54 54

Nuove API I/O di Java Nuove API I/O di Java

Canali Canali

Connessione a dispositivi per l'I/O Connessione a dispositivi per l'I/O

Interazione efficiente con buffer Interazione efficiente con buffer

interfaccia interfaccia ReadableByteChannel ReadableByteChannel

Metodo Metodo read read

interfaccia interfaccia WriteableByteChannel WriteableByteChannel

Metodo Metodo write write

lettura sparsa e scrittura raccolta lettura sparsa e scrittura raccolta

Classe Classe FileChannel FileChannel

(55)

55 55

Nuove API I/O di Java Nuove API I/O di Java

File Lock File Lock

Pone restrizioni all'accesso di una porzione di file Pone restrizioni all'accesso di una porzione di file

FileChannel FileChannel , posizione, dimensione , posizione, dimensione

esclusivo o condiviso esclusivo o condiviso

Charset Charset

Package Package java.nio.charset java.nio.charset

Class

Class CharsetCharset

Metodi Metodi decodedecode, , encodeencode Class

Class CharsetDecoderCharsetDecoder, CharsetEncoder, CharsetEncoder

Riferimenti

Documenti correlati

se copiate pi` u file in una directory mydir e poi vi accorgete che mydir in realt`a non esiste, tutti i file saranno stati copiati in un file di nome mydir uno sull’altro: alla fine

Come esempio per l’analisi degli errori di arrotondamento scriviamo il seguente file di tipo script dal nome scriptrad.m.. L’istruzione plot genera grafici in

L’attributo st mode contiene il file mode, cio` e una sequenza di bit ottenuti facendo l’OR bit a bit della stringa che esprime i permessi al file e una costante che determina il

--- Premesso che il rinvenimento di ordigni bellici nel territorio del comune di San Dona' di Piave e Jesolo ha reso necessario l'intervento della Prefettura di Venezia -

- nei giorni successivi veniva pertanto richiesta un’offerta a tre ditte individuate nell’albo fornitori e/o operanti sulla piazza della Spezia (Idrocalor, S.T.EL. e Parodi

- registrare l’impegno di spesa di € 130,63 oltre € 28,74 per iva, per un totale di € 159,37, sul capitolo U.1.03.02.09 manutenzione ordinaria e riparazioni - V livello

Stefano srl, ditta di fiducia iscritta nell’albo fornitori di questa Direzione regionale, ha presentato un preventivo per le lavorazioni da eseguire al costo di euro 500,00

[r]