programmazione 2 input output sustream e file · input/output in java.. stream uno stream e’...

153
Programmazione 2 Input Output su Stream e File

Upload: others

Post on 20-Aug-2020

20 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Programmazione 2 Input Output suStream e File · Input/Output in Java.. Stream Uno stream e’ un’astrazione che produce o consuma informazioni. Uno stream e’ collegato a un devide

Programmazione 2

Input Output su Stream e File

Page 2: Programmazione 2 Input Output suStream e File · Input/Output in Java.. Stream Uno stream e’ un’astrazione che produce o consuma informazioni. Uno stream e’ collegato a un devide

..

In generale ogni programma ha un flusso (stream) di dati in input ed uno in output.

Stream di output

Stream di input

Stream

Page 3: Programmazione 2 Input Output suStream e File · Input/Output in Java.. Stream Uno stream e’ un’astrazione che produce o consuma informazioni. Uno stream e’ collegato a un devide

..

Il package java.io fornisce le classi, le interfacce e le eccezioni per gestire l’input e l’output dei programmi.

Il package mette a disposizione una serie di classi per trattare i file dal punto di vista del S.O. e un’altra serie per gestire la lettura e la scrittura di dati sui file.

Input/Output in Java

Page 4: Programmazione 2 Input Output suStream e File · Input/Output in Java.. Stream Uno stream e’ un’astrazione che produce o consuma informazioni. Uno stream e’ collegato a un devide

.. Stream

Uno stream e’ un’astrazione che produce o consuma informazioni. Uno stream e’ collegato a un devide fisico.

Tutti gli stream si comportano allo stesso modo, anche se il device fisico a cui sono collegati e’ diverso.

In questo modo, le stesse classe I/O e metodi possono essere applicate ad ogni tipo di device.

Per esempio, gli stessi metodi possono essere usati per scrivere nella console o un su un file di disco.

Page 5: Programmazione 2 Input Output suStream e File · Input/Output in Java.. Stream Uno stream e’ un’astrazione che produce o consuma informazioni. Uno stream e’ collegato a un devide

.. Stream

Gli Stream rappresentano flussi sequenziali di byte.

Tutti gli Stream vengono gestiti con algoritmi di questo tipo:

Open Stream

Close Stream

more

data ?

handle data

N

Y

Page 6: Programmazione 2 Input Output suStream e File · Input/Output in Java.. Stream Uno stream e’ un’astrazione che produce o consuma informazioni. Uno stream e’ collegato a un devide

.. java.io

Java è uno dei pochi linguaggi che gestiscono i dati in formato UNICODE (16 bit).

http://www.unicode.org/standard/translations/italian.html

Il package java.io distingue due gerarchie di classi per la gestione degli stream:

•byte stream (8 bit - byte)

•character stream (16bit - char)

Page 7: Programmazione 2 Input Output suStream e File · Input/Output in Java.. Stream Uno stream e’ un’astrazione che produce o consuma informazioni. Uno stream e’ collegato a un devide

..java.io

Il formato 8bit-byte è gestito tramite le classi InputStream e OutputStream

InputStream

FileInputStream

PipedInputStream

ByteArrayInputStream

FilterInputStream

StringBufferInputStream

SequenceInputStream

ObjectInputStream

PushBackInputStream

BufferedInputStream

DataInputStream

LineNumberInputStream

OutputStream

FileOutputStream

PipedOutputStream

ByteArrayOutputStream

FilterOutputStream

ObjectOutputStream

BufferedOutputStream

DataOutputStream

PrintStream

Page 8: Programmazione 2 Input Output suStream e File · Input/Output in Java.. Stream Uno stream e’ un’astrazione che produce o consuma informazioni. Uno stream e’ collegato a un devide

..Le classi Byte Stream

BufferedInputStream Buffered input stream

BufferedOutputStream Buffered output stream

ByteArrayInputStream Legge da un array di byte

ByteArrayOutputStream Scrive su un array di byte

DataInputStream Leggere i tipi standard di Java

DataOutputStream Scrive tipi standard di Java

FileInputStream Legge da un File

FileOutputStream Scrive su un File

FilterInputStream Implementa InputStream

FilterOutputStream Implementa OutputStream

InputStream Classe astratta che descrive uno stream in input

ObjectInputStream Input stream per oggetti

ObjectOutputStream Output stream per oggetti

OutputStream Classe astratta che descrive stream in output

Page 9: Programmazione 2 Input Output suStream e File · Input/Output in Java.. Stream Uno stream e’ un’astrazione che produce o consuma informazioni. Uno stream e’ collegato a un devide

..

PipedInputStream Input pipe

PipedOutputStream Output pipe

PrintStream Output stream che contiene print( ) e println( )

PushbackInputStream Input stream che permette al byte di tornare nello stream

RandomAccessFile Supporta random access file I/O

SequenceInputStream Input stream che e’ la combinazione di due o piu’input stream che saranno letti in modo sequenziale

Le classi Byte Stream

Page 10: Programmazione 2 Input Output suStream e File · Input/Output in Java.. Stream Uno stream e’ un’astrazione che produce o consuma informazioni. Uno stream e’ collegato a un devide

..java.io

Il formato Unicode è gestito tramite le classi Reader e Writer

LineNumberReader

Reader

BufferedReader

CharArrayReader

FilterReader

InputStreamReader

StringReader

PipedReader PushBackReader

FileReader

Writer

BufferedWriter

CharArrayWriter

FilterWriter

OutputStreamWriter

PipedWriter

FileWriter

StringWriter

Page 11: Programmazione 2 Input Output suStream e File · Input/Output in Java.. Stream Uno stream e’ un’astrazione che produce o consuma informazioni. Uno stream e’ collegato a un devide

.. Character Stream Classes

BufferedReader

BufferedWriter

CharArrayReader

CharArrayWriter

FileReader

FileWriter

FilterReader

FilterWriter

InputStreamReader

LineNumberReader

OutputStreamWriter

PipedReader

PipedWriter

PrintWriter

PushbackReader

Reader Abstract

StringReader

StringWriter

Writer

Page 12: Programmazione 2 Input Output suStream e File · Input/Output in Java.. Stream Uno stream e’ un’astrazione che produce o consuma informazioni. Uno stream e’ collegato a un devide

..Stream

Lo stream è un FileFileReader

FileWriter

FileInputStream

FileOutputStream

File

Lo stream è una stringaStringReader

StringWriter

Pipe

Lo stream coincide con una pipe. Le pipes sono canali di collegamento tra l’output di un thread e l’input di un altro thread

PipedReader

PipedWriter

PipedInputStream

PipedOutputStream

Lo stream coincide con un arrayCharArrayReader

CharArrayWriter

ByteArrayInputStream

ByteArrayOutputStreamMemoria

DescrizioneClasseTipo di I/O

Page 13: Programmazione 2 Input Output suStream e File · Input/Output in Java.. Stream Uno stream e’ un’astrazione che produce o consuma informazioni. Uno stream e’ collegato a un devide

..Stream

InputStreamReader

OutputStreamWriter

Conversione

Byte - Char

I dati vengono filtrati in base ad un filtro

FilterReader

FilterWriter

FilterInputStream

FilterOutputStream

Filtering

Buffering

La lettura (scrittura) èbufferizzata, migliorando le prestazioni.

BufferedReader

BufferedWriter

BufferedInputStream

BufferedOutputStream

Convertono i dati da/in un formato indipendente dalla macchina

DataInputStream

DataOutputStreamData

Conversion

DescrizioneClasseTipo di I/O

Page 14: Programmazione 2 Input Output suStream e File · Input/Output in Java.. Stream Uno stream e’ un’astrazione che produce o consuma informazioni. Uno stream e’ collegato a un devide

.. Input e Output su byte stream

InputStream e OutputStream consentono la lettura e

scrittura di stream di byte.

I metodi definiti da queste due classi astratte sono disponibili a

tutte le loro sottoclassi.

Quindi essi formano un insieme minimale di funzioni I/O che

tutti gli stream di byte hanno.

I metodi in InputStream e OutputStream possono generare

eccezioni IOException.

Page 15: Programmazione 2 Input Output suStream e File · Input/Output in Java.. Stream Uno stream e’ un’astrazione che produce o consuma informazioni. Uno stream e’ collegato a un devide

..Input sequenziale

La classe InputStream consente di accedere ad uno stream di input in modo astratto.

Questa classe non ha metodi per leggere numeri o stringhe, ma può leggere soltanto singoli byte.

I metodi disponibili sono:

public void close()

public int available()

public long skip(long n)

public abstract int read()

public int read(byte buffer[])

public int read(byte buffer[], int offset, int length)

Page 16: Programmazione 2 Input Output suStream e File · Input/Output in Java.. Stream Uno stream e’ un’astrazione che produce o consuma informazioni. Uno stream e’ collegato a un devide

..Input sequenziale di caratteri

La classe Reader si comporta analogamente.

I metodi disponibili sono:

public void close()

public int available()

public long skip(long n)

public abstract int read()

public int read(char buffer[])

public int read(char buffer[], int offset, int length)

Page 17: Programmazione 2 Input Output suStream e File · Input/Output in Java.. Stream Uno stream e’ un’astrazione che produce o consuma informazioni. Uno stream e’ collegato a un devide

..Output sequenziale

Analogamente le classi OutputStream e Writerconsentono di accedere ad uno stream di output in modo astratto.

I metodi disponibili per OutputStream sono:

public void close()

public int flush()

public abstract void write(int)//scrive un byte non c’e’//bisogno di fare un cast.

public void write(byte buffer[])

public void write(byte buffer[], int offset, int length)

Page 18: Programmazione 2 Input Output suStream e File · Input/Output in Java.. Stream Uno stream e’ un’astrazione che produce o consuma informazioni. Uno stream e’ collegato a un devide

..Output sequenziale

I metodi disponibili per Writer sono:

public void close()

public int flush()

public abstract void write(int)

public void write(char c[]) //scrive un array di caratteri

public void write(char c[], int offset, int length) //scrive lenght caratteri di c[] iniziando da offeset

public void write(String str)

public void write(String str, int offset, int length)

Page 19: Programmazione 2 Input Output suStream e File · Input/Output in Java.. Stream Uno stream e’ un’astrazione che produce o consuma informazioni. Uno stream e’ collegato a un devide

..Risorse del Sistema

I programmi Java vengono eseguiti all’interno di un ambiente di lavoro (environment).

L’ambiente di lavoro corrisponde con la parte del Sistemavisibile da parte del processo.

Il processo interagisce con il sistema esclusivamente tramite il suo ambiente di lavoro.

Processo

Sistema

Ambiente

Page 20: Programmazione 2 Input Output suStream e File · Input/Output in Java.. Stream Uno stream e’ un’astrazione che produce o consuma informazioni. Uno stream e’ collegato a un devide

..Risorse del Sistema

Il Sistema dispone di alcune risorse, che vengono messe a disposizione dell’utente tramite l’ambiente.

Java fornisce la classe System per accedere a tali risorse.

Programma Java

Classe System

Ambiente Run-Time

Page 21: Programmazione 2 Input Output suStream e File · Input/Output in Java.. Stream Uno stream e’ un’astrazione che produce o consuma informazioni. Uno stream e’ collegato a un devide

.. Stream Predefiniti

Tutti i programmi Java automaticamente importano java.lang package.

Questo pacchetto definisce una classe System, la quale contiene diversi aspetti dell’ambiente in run-time.

Per esempio essa contiene 3 variabili di streampredefiniti: in, out, e err.

Page 22: Programmazione 2 Input Output suStream e File · Input/Output in Java.. Stream Uno stream e’ un’astrazione che produce o consuma informazioni. Uno stream e’ collegato a un devide

..

A differenza delle altre classi, dalla classe System non èpossibile istanziare oggetti; essa è una final class e tutti i suoi costruttori sono privati.

Le final class si usano direttamente come se fossero oggetti.

Tutti i metodi e le variabili della classe System sono class methods e class variables e sono dichiarati static e public. Questo significa che possono essere usate da qualsiasi parte del programma senza riferimento a un oggetto specifico.

Stream Predefiniti

Page 23: Programmazione 2 Input Output suStream e File · Input/Output in Java.. Stream Uno stream e’ un’astrazione che produce o consuma informazioni. Uno stream e’ collegato a un devide

..La classe System

Per richiamare un class methods o accedere ad una class variables si usa la Java dot notation.

Ad esempio, per accedere alla variabile di classe out di System si scrive:

System.out

Analogamente si procede per accedere ai metodi di System:

System.getProperty(argument);

Page 24: Programmazione 2 Input Output suStream e File · Input/Output in Java.. Stream Uno stream e’ un’astrazione che produce o consuma informazioni. Uno stream e’ collegato a un devide

..La classe System

Java, in accordo ai S.O. Unix-like, definisce tre streamper gli standard Input/Output:

System.out : standard output stream (console).

System.in: standard input, (tastiera).

System.err: standard error (console).

Page 25: Programmazione 2 Input Output suStream e File · Input/Output in Java.. Stream Uno stream e’ un’astrazione che produce o consuma informazioni. Uno stream e’ collegato a un devide

..System.in e’ un oggetto di tipo InputStream;

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

public static final InputStream in

public static final PrintStream out

public static final PrintStream err

Questi sono byte streams, anche se sono tipicamente usati per leggere e scrivere caratteri da e nella console.

Essi sono byte e no character streams perche’ gli stream predefiniti erano parti delle specifiche originali di Java, che non conteneva ancora character streams.

E’ possibile fare il wrap di questi in stream di caratteri.

Stream Predefiniti

Page 26: Programmazione 2 Input Output suStream e File · Input/Output in Java.. Stream Uno stream e’ un’astrazione che produce o consuma informazioni. Uno stream e’ collegato a un devide

..La classe System

System.out e System.err si comportano allo stesso modo. I metodi più comuni sono:

•print()

•println()

•write()

I primi due consentono di scrivere stringhe, mentre il terzo viene utilizzato per l’output di byte.

Page 27: Programmazione 2 Input Output suStream e File · Input/Output in Java.. Stream Uno stream e’ un’astrazione che produce o consuma informazioni. Uno stream e’ collegato a un devide

..La classe System

System.out.print("Duke is not a penguin!\n");

Notare che print() e println() sono simili:

System.out.println("Duke is not a penguin!");

è equivalente a:

Page 28: Programmazione 2 Input Output suStream e File · Input/Output in Java.. Stream Uno stream e’ un’astrazione che produce o consuma informazioni. Uno stream e’ collegato a un devide

..La classe System

Esempio:

public class DataTypePrintTest

{ public static void main(String[] args)

{ String stringData = "Java Mania";

char[] charArrayData = { 'a', 'b', 'c' };

int integerData = 4;

long longData = Long.MIN_VALUE;

float floatData = Float.MAX_VALUE;

double doubleData = Math.PI;

boolean booleanData = true;

Page 29: Programmazione 2 Input Output suStream e File · Input/Output in Java.. Stream Uno stream e’ un’astrazione che produce o consuma informazioni. Uno stream e’ collegato a un devide

..La classe System

System.out.println(stringData);

System.out.println(charArrayData);

System.out.println(integerData);

System.out.println(longData);

System.out.println(floatData);

System.out.println(doubleData);

System.out.println(booleanData);

}

}

Java Mania

abc

4

-9223372036854775808

3.40282e+38

3.14159

true

L’output fornito è il seguente:

Page 30: Programmazione 2 Input Output suStream e File · Input/Output in Java.. Stream Uno stream e’ un’astrazione che produce o consuma informazioni. Uno stream e’ collegato a un devide

..Risorse di Sistema

La classe System consente di accedere alle seguenti risorse tramite il metodo getProperty():

"file.separator""java.class.path""java.class.version""java.home""java.vendor""java.vendor.url""java.version""line.separator""os.arch""os.name""os.version""path.separator""user.dir""user.home""user.name"

Permette di determinare il nome del sistema operativo, la versione della Java Virtual Machine, il carattere che determina il carattere di separatore di file (‘/’). Consultate le API per le specifiche.

Page 31: Programmazione 2 Input Output suStream e File · Input/Output in Java.. Stream Uno stream e’ un’astrazione che produce o consuma informazioni. Uno stream e’ collegato a un devide

..Input da tastiera

Allo standard input si accede tramite System.in.

Diversamente da System.out, lo standard input non prevede la gestione dei vari formati dei dati.

Le conversioni devono essere fatte in modo esplicito.

Page 32: Programmazione 2 Input Output suStream e File · Input/Output in Java.. Stream Uno stream e’ un’astrazione che produce o consuma informazioni. Uno stream e’ collegato a un devide

.. Input da tastieraSystem.in e’ un’istanza di InputStream, quindi si ha accesso automaticamente a tutti i metodi definiti da InputStream.

InputStream definisce un solo metodo di input read( ), legge bytes.

Ci sono 3 versioni di read( ):

int read( ) throws IOException //legge un singolo carattere. Ritorna -1 quando incontra la fine dello stream.

int read(byte data[ ]) throws IOException // Legge byte dal input stream e li mette in data fino a quando o l’array e’ pieno o si e’ raggiunto la fine dello stream, o vi e’ stato un errore. Torna il num di bytes letti o -1 se si e’ alla fine dello stream.

int read(byte data[ ], int start, int max) throws IOException //Legge input in data iniziando da start. Vengono immagazzinati fino a max byte. Torna il num di bytes letti o -1 se si e’ alla fine dello stream.

Tutti i metodi generano IOException se si verifica un errore. Quando legge da System.in, premendo ENTER si genera una condizione di fine stream.

Page 33: Programmazione 2 Input Output suStream e File · Input/Output in Java.. Stream Uno stream e’ un’astrazione che produce o consuma informazioni. Uno stream e’ collegato a un devide

..

// Read an array of bytes from the keyboard.import java.io.*;

class ReadBytes {public static void main(String args[])throws IOException {byte data[] = new byte[10];System.out.println("Enter some characters.");System.in.read(data);System.out.print("You entered: ");for(int i=0; i < data.length; i++)

System.out.print((char) data[i]);}

}

Esempio di lettura di un array di byte da System.in

Enter some characters:Read BytesYou entered:Read Bytes

int read(byte data[ ])

Page 34: Programmazione 2 Input Output suStream e File · Input/Output in Java.. Stream Uno stream e’ un’astrazione che produce o consuma informazioni. Uno stream e’ collegato a un devide

..

// Read an array of bytes from the keyboard.import java.io.*;

class ReadBytes {public static void main(String args[])throws IOException {byte data[] = new byte[10];System.out.println("Enter some characters.");System.in.read(data);System.out.print("You entered: ");for(int i=0; i < data.length; i++)

System.out.print((char) data[i]+" ");}

}

Esempio di lettura di un array di byte da System.in

Enter some characters:Read BytesYou entered:R e a d B y t e s

int read(byte data[ ])

Page 35: Programmazione 2 Input Output suStream e File · Input/Output in Java.. Stream Uno stream e’ un’astrazione che produce o consuma informazioni. Uno stream e’ collegato a un devide

..

import java.io.*;

class ReadBytes{

public static void main(String args[])throws IOException {byte data[] = new byte[10];System.out.println("Enter some characters:");System.in.read(data,5,5);System.out.print("You entered: ");for(int i=0; i < 5; i++)data[i]='*';

for(int i=0; i < data.length; i++)System.out.print((char) data[i]);

}} Enter some characters:

Read BytesYou entered:*****Read

int read(byte data[ ], int start, int max)

Esempio di lettura di un array di byte da System.in

Page 36: Programmazione 2 Input Output suStream e File · Input/Output in Java.. Stream Uno stream e’ un’astrazione che produce o consuma informazioni. Uno stream e’ collegato a un devide

..

import java.io.*;

class ReadBytes{

public static void main(String args[])throws IOException {byte data[] = new byte[10];System.out.println("Enter some characters:");System.in.read(data,5,5);System.out.print("You entered: ");for(int i=0; i < 5; i++)data[i]='*';

for(int i=0; i < data.length; i++)System.out.print((char) data[i]);

}} Enter some characters:

Read BytesYou entered:*****Re

int read(byte data[ ], int start, int max)

Esempio di lettura di un array di byte da System.in

System.in.read(data,5,2);

Page 37: Programmazione 2 Input Output suStream e File · Input/Output in Java.. Stream Uno stream e’ un’astrazione che produce o consuma informazioni. Uno stream e’ collegato a un devide

..

import java.io.*;

class ReadBytes{

public static void main(String args[])throws IOException {byte data[] = new byte[10];System.out.println("Enter some characters:");System.in.read(data,5,5);System.out.print("You entered: ");for(int i=0; i < 5; i++)data[i]='*';

for(int i=0; i < data.length; i++)System.out.print((char) data[i]);

}}

Enter some characters:Exception in thread “main” java.lang.IndexOutOfBoundsException

int read(byte data[ ], int start, int max)

Esempio di lettura di un array di byte da System.in

System.in.read(data,5,8);

Page 38: Programmazione 2 Input Output suStream e File · Input/Output in Java.. Stream Uno stream e’ un’astrazione che produce o consuma informazioni. Uno stream e’ collegato a un devide

..

import java.io.*;

class ReadBytes{

public static void main(String args[])throws IOException {byte data[] = new byte[10];System.out.println("Enter some characters:");System.in.read(data,5,5);System.out.print("You entered: ");for(int i=0; i < 5; i++)data[i]='*';

for(int i=0; i < data.length; i++)System.out.print((char) data[i]);

}}

int read(byte data[ ], int start, int max)

Esempio di lettura di un array di byte da System.in

int num= System.in.read(data,5,2);

System.out.printf(“The number of readed chars is: %d”,num);

Enter some characters:Read BytesYou entered:*****ReThe number of readed chars is: 2

Page 39: Programmazione 2 Input Output suStream e File · Input/Output in Java.. Stream Uno stream e’ un’astrazione che produce o consuma informazioni. Uno stream e’ collegato a un devide

..

import java.io.*;

class ReadBytes {

public static void main(String args[])throws IOException {char data=‘a’;while (data !=‘f’){

System.out.println("Enter a character:");data=(char) System.in.read();System.out.print("You entered: ");System.out.println(data);

}}

}

Esempio di lettura di un array di byte da System.in

Enter a character:readYou entered: rEnter a character:You entered: eEnter a character:You entered: aEnter a character:You entered: dEnter a character:You entered: Enter a character:You entered:

Enter a character:fYou entered: f

int read()

Page 40: Programmazione 2 Input Output suStream e File · Input/Output in Java.. Stream Uno stream e’ un’astrazione che produce o consuma informazioni. Uno stream e’ collegato a un devide

.. Output da tastiera System.out

System.out e’ un byte stream.

Console output e’ attuata con print( ) and println( ).

Come avevamo detto questi metodi sono definiti dalla classe PrintStream che e’ un output stream derivato da OutputStream, quindi implementa metodo write( ).

void write(int byteval) throws IOException

Non si usa spesso write( ) ma si preferiscono print( ) and println( ).

Si hanno anche i metodi printf(). Danno un controllo dettagliato sul formato dei dati in output.

Page 41: Programmazione 2 Input Output suStream e File · Input/Output in Java.. Stream Uno stream e’ un’astrazione che produce o consuma informazioni. Uno stream e’ collegato a un devide

..

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

Int b;b = 'X';System.out.write(b);System.out.write('\n');

}}

Es: Output da tastiera System.out

Page 42: Programmazione 2 Input Output suStream e File · Input/Output in Java.. Stream Uno stream e’ un’astrazione che produce o consuma informazioni. Uno stream e’ collegato a un devide

..I File

I file sono sequenze ordinate di byte memorizzati su unità di memorizzazione di massa.

In generale, le funzionalità di accesso ai file prevedono due meccanismi di base:

•accesso sequenziale (stream)

•accesso diretto (random)

Al primo tipo appartengono anche oggetti in grado di gestire flussi di dati non legati direttamente ai file, come nel caso degli standard I/O.

Page 43: Programmazione 2 Input Output suStream e File · Input/Output in Java.. Stream Uno stream e’ un’astrazione che produce o consuma informazioni. Uno stream e’ collegato a un devide

..I File

I file sono suddivisibili in due categorie:

•File di Testo

•File Binari

I File di Testo sono costituiti da caratteri dell’alfabeto, raggruppati in parole e righe. Sono visualmenteinterpretabili dall’utente.

I File Binari sono costituiti da byte di qualunque valore. La struttura interna è interpretabile solo tramite un apposito programma di gestione.

Page 44: Programmazione 2 Input Output suStream e File · Input/Output in Java.. Stream Uno stream e’ un’astrazione che produce o consuma informazioni. Uno stream e’ collegato a un devide

..I File

Gli stream di Standard Input e Standard Output prima descritti sono due casi particolari di file.

Il Sistema Operativo tratta tutti gli stream come casi particolari di File.

Java fornisce un’astrazione del concetto di File, semplificandone l’utilizzo.

Page 45: Programmazione 2 Input Output suStream e File · Input/Output in Java.. Stream Uno stream e’ un’astrazione che produce o consuma informazioni. Uno stream e’ collegato a un devide

..I File

In Java i file, come gli stream, sono gestiti tramite le classi presenti nella libreria standard java.io.

La prima operazione da fare consiste nell’aprire (open) il file. Questa operazione informa il S.O. che vogliamo accedere a quel determinato file.

Al termine di tutte le operazioni il file deve essere chiuso (close) per rilasciare le risorse impegnate e svuotare eventuali buffer.

Page 46: Programmazione 2 Input Output suStream e File · Input/Output in Java.. Stream Uno stream e’ un’astrazione che produce o consuma informazioni. Uno stream e’ collegato a un devide

..

Per creare un byte stream collegato a un file, si usa FileInputStream or FileOutputStream.

Per aprire un file si crea un oggetto di queste classi specificando il nome del file come argomento del costruttore.

Dopo aver aperto con successo il file allora si puo’leggere o scrivere nel file.

Leggere e Scrivere un File usando un byte stream

Page 47: Programmazione 2 Input Output suStream e File · Input/Output in Java.. Stream Uno stream e’ un’astrazione che produce o consuma informazioni. Uno stream e’ collegato a un devide

.. Input sequenziale da file

Come abbiamo detto la classe FileInputStreamestende la classe InputStream per l’accesso sequenziale ai file.

In particolare vengono definiti i seguenti 2 costruttori:

public FileInputStream(String filename) throws FileNotFoundException

public FileInputStream(File fp)

throws FileNotFoundException

I metodi a disposizione sono simili a quelli di InputStream.

Page 48: Programmazione 2 Input Output suStream e File · Input/Output in Java.. Stream Uno stream e’ un’astrazione che produce o consuma informazioni. Uno stream e’ collegato a un devide

..Output sequenziale da file

La classe FileOutputStream estende la classe OutputStream per l’accesso sequenziale ai file.

public FileOutputStream(String filename)

throws IOException

public FileOutputStream(String filename, boolean append)

throws IOException

public FileOutputStream(File file)

throws IOException

public FileOutputStream(File file, boolean append)

throws IOException

I metodi a disposizione sono simili a quelli di OutputStream.

Page 49: Programmazione 2 Input Output suStream e File · Input/Output in Java.. Stream Uno stream e’ un’astrazione che produce o consuma informazioni. Uno stream e’ collegato a un devide

.. Leggere e Scrivere Dati binari Abbiamo scritto e letto byte contenenti ASCII values.

Possiamo leggere e scrivere altri tipi di dati. Per esempio si possono creare file contenenti ints, doubles, o shorts.

Per leggere o scrivere valori binari di tipi primitivi si usano DataInputStream e DataOutputStream.

DataOutputStream implementa DataOutput interfaccia: essa definisce i metodi che scrivono tutti i tipi primitivi di Java.

Questi dati sono scritti usando il formato binario a noi “non comprensibile”.

Il costruttore: DataOutputStream(OutputStream outputStream)outputStream e’ lo stream dove i dati verranno scritti.

Per scrivere in un file, si usa l’oggetto creato da FileOutputStream per questo parametro.

Page 50: Programmazione 2 Input Output suStream e File · Input/Output in Java.. Stream Uno stream e’ un’astrazione che produce o consuma informazioni. Uno stream e’ collegato a un devide

.. Metodi di Output definiti da DataOutputStream

void writeBoolean(boolean val )

void writeByte(int val )

void writeChar(int val )

void writeDouble(double val )

void writeFloat(float val )

void writeInt(int val )

void writeLong(long val )

void writeShort(int val )

Page 51: Programmazione 2 Input Output suStream e File · Input/Output in Java.. Stream Uno stream e’ un’astrazione che produce o consuma informazioni. Uno stream e’ collegato a un devide

.. Input

DataInputStream implementa DataInput interfaccia, la quale da’ metodi per leggere i tipi primitivi di Java.

DataInputStream usa un’istanza di InputStream

DataInputStream(InputStream inputStream)

inputStream e’ lo stream che e’ legato all’istanza di DataInputStream che si sta creando.

Per leggere da un file si usa l’oggetto creato da FileInputStream per questo parametro.

Page 52: Programmazione 2 Input Output suStream e File · Input/Output in Java.. Stream Uno stream e’ un’astrazione che produce o consuma informazioni. Uno stream e’ collegato a un devide

.. Metodi di Input definiti da DataInput Stream

boolean readBoolean( )

byte readByte( )

char readChar( )

double readDouble( )

float readFloat( )

int readInt( )

long readLong( )

short readShort( )

Page 53: Programmazione 2 Input Output suStream e File · Input/Output in Java.. Stream Uno stream e’ un’astrazione che produce o consuma informazioni. Uno stream e’ collegato a un devide

..

Es in RWData.java. Il file su cui si scrive “testdata” e’ binario.

L’output del programma RWData.java

Writing 10

Writing 1023.56

Writing true

Writing 90.28

Reading 10

Reading 1023.56

Reading true

Reading 90.28

Leggere e Scrivere Dati binari

Page 54: Programmazione 2 Input Output suStream e File · Input/Output in Java.. Stream Uno stream e’ un’astrazione che produce o consuma informazioni. Uno stream e’ collegato a un devide

.. Stream basati sui caratteri

In cima alla gerarchia dei character stream ci sono le classi Reader e Writer.

Tutti i metodi generano IOException in presenza di errori.

I metodi definiti da queste due classi sono disponibili per tutte le sottoclassi.

Quindi, sono un insieme minimale di funzioni di I/O per gli stream di caratteri.

Page 55: Programmazione 2 Input Output suStream e File · Input/Output in Java.. Stream Uno stream e’ un’astrazione che produce o consuma informazioni. Uno stream e’ collegato a un devide

.. I metodi della classe Reader

abstract void close( )

int read( )

int read(char buffer[ ])

abstract int read(char buffer[ ],int offset,int numChars)

long skip(long numChars) //salta numChars caratteri //dell’input, e ritorna il numero di caratteri effettivamente //saltati

Page 56: Programmazione 2 Input Output suStream e File · Input/Output in Java.. Stream Uno stream e’ un’astrazione che produce o consuma informazioni. Uno stream e’ collegato a un devide

.. I metodi della classe Writer

Writer append(char ch) throws IOException //appende ch alla //fine dell’output stream

abstract void close( )

abstract void flush( )

void write(int ch)

void write(char buffer[ ]) //scrive l’array di caratteri sull’output //stream

abstract void write(char buffer[ ],int offset,int numChars)

void write(String str)

void write(String str, int offset,int numChars)//scrive una //sottostinga di str iniziando da offeset lunga numChars nello //stream di output

Page 57: Programmazione 2 Input Output suStream e File · Input/Output in Java.. Stream Uno stream e’ un’astrazione che produce o consuma informazioni. Uno stream e’ collegato a un devide

..Input da tastiera

Le classi Reader e Writer serviranno a risolvere tre problemi:

1) vogliamo leggere singole righe di input e non generici flussi di byte;

2) In caso di errore è necessario gestire le eccezionigenerate;

3) Dobbiamo essere in grado di leggere stringhe, e numeri, nei vari formati che conosciamo.

Page 58: Programmazione 2 Input Output suStream e File · Input/Output in Java.. Stream Uno stream e’ un’astrazione che produce o consuma informazioni. Uno stream e’ collegato a un devide

.. Input da console usando uno stream di caratteri

System.in e’ un byte stream, quindi bisogna wrap System.in in un tipo di Reader.

La miglior classe per leggere da console input e’ BufferedReader,la quale sopporta un buffered input stream.

Non si puo’ costruire direttamente un BufferedReader daSystem.in. Si deve prima convertire in uno stream di caratteri.

Si usa InputStreamReader, che converte bytes in caratteri.

Per ottenere un InputStreamReader oggetto collegato a System.in, si usa:InputStreamReader(InputStream inputStream)

Page 59: Programmazione 2 Input Output suStream e File · Input/Output in Java.. Stream Uno stream e’ un’astrazione che produce o consuma informazioni. Uno stream e’ collegato a un devide

..Input da tastiera

I costruttori sono:

public InputStreamReader(InputStream IS)

Ci sono altri costruttori..consultare le API

Il primo passo consiste quindi nell’utilizzare la classe InputStreamReader che estende la classe Reader. Questa classe costituisce un ponte tra gli stream di byte e gli streamdi caratteri.

Object InputStreamReaderReader

Page 60: Programmazione 2 Input Output suStream e File · Input/Output in Java.. Stream Uno stream e’ un’astrazione che produce o consuma informazioni. Uno stream e’ collegato a un devide

..Input da tastiera

Abbiamo detto che come InputStream possiamo utilizzare la classe System.in:

Il costruttore InputStreamReader() crea quindi un oggetto reader per leggere sequenze di caratteri a partire da System.in.

InputStreamReader reader = new InputStreamReader(System.in);

Page 61: Programmazione 2 Input Output suStream e File · Input/Output in Java.. Stream Uno stream e’ un’astrazione che produce o consuma informazioni. Uno stream e’ collegato a un devide

..Input da tastiera

L’oggetto reader legge singoli caratteri.

La classe BufferedReader trasforma un reader in un lettore in grado di leggere intere righe.

InputStreamReader reader = new InputStreamReader(System.in);

BufferedReader console = new BufferedReader(reader);

BufferedReader(Reader in);

BufferedReader(Reader in, int size); //specifica la dimensione dell’input buffer.

Page 62: Programmazione 2 Input Output suStream e File · Input/Output in Java.. Stream Uno stream e’ un’astrazione che produce o consuma informazioni. Uno stream e’ collegato a un devide

..Input da tastiera

Il metodo readLine della classe BufferedReader consente di leggere una singola riga di testo da tastiera.

Public String readLine() throws IOException

InputStreamReader reader = new InputStreamReader(System.in);

BufferedReader console = new BufferedReader(reader);

System.out.println(“Inserisci una riga di testo”);

String str = console.readLine();

Page 63: Programmazione 2 Input Output suStream e File · Input/Output in Java.. Stream Uno stream e’ un’astrazione che produce o consuma informazioni. Uno stream e’ collegato a un devide

..Input da tastiera

La variabile reader può essere omessa.

Lo standard input System.in viene trasformato direttamente in un oggetto di tipo lettore bufferizzato.

BufferedReader console = new BufferedReader ( new InputStreamReader (System.in));

System.out.println(“Inserisci una riga di testo”);

String str = console.readLine();

Page 64: Programmazione 2 Input Output suStream e File · Input/Output in Java.. Stream Uno stream e’ un’astrazione che produce o consuma informazioni. Uno stream e’ collegato a un devide

..

Quindi, si usa l’oggetto prodotto da InputStreamReader, per costruire un BufferedReader nel seguente modo:

BufferedReader(Reader inputReader)

inputReader e’ lo stream collegato ad un’istanza di BufferedReader che si sta creando.

Mettendo tutto insieme: BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

br e’ uno stream basato sui caratteri collegato alla console attraverso System.in

Input da console usando uno stream di caratteri

Page 65: Programmazione 2 Input Output suStream e File · Input/Output in Java.. Stream Uno stream e’ un’astrazione che produce o consuma informazioni. Uno stream e’ collegato a un devide

.. Leggere caratteri

Caratteri sono letti usando da System.in usando read( ) definito da BufferedReader.

Ci sono 3 versioni di read() definiti da BufferedReader:

int read( ) throws IOException //legge un semplice Unicodecarattere. Torna -1 se la fine dello stream e’ raggiunta.

int read(char data[ ]) throws IOException // legge caratteri dallo stream di input e li mette in data fino a quando e’ pieno o si raggiunge la fine del file o si incontra un errore. Torna il numero di caratteri letti o -1 alla fine dello stream.

int read(char data[ ], int start, int max) throws IOException //legge input in data inziando da start. Sono letti un massimo di max caratteri. Torna il numero di caratteri letti o -1 alla fine dello stream.

Page 66: Programmazione 2 Input Output suStream e File · Input/Output in Java.. Stream Uno stream e’ un’astrazione che produce o consuma informazioni. Uno stream e’ collegato a un devide

.. Es: Leggere Caratteri da tastiera// Use a BufferedReader to read characters from the console.

import java.io.*;

class ReadChars {

public static void main(String args[])

throws IOException

{

char c;

BufferedReader br = new

BufferedReader(new InputStreamReader(System.in));

System.out.println("Enter characters, period to quit.");

// read characters

do {

c = (char) br.read();

System.out.println(c);

} while(c != '.');

}

}

Page 67: Programmazione 2 Input Output suStream e File · Input/Output in Java.. Stream Uno stream e’ un’astrazione che produce o consuma informazioni. Uno stream e’ collegato a un devide

.. Leggere una stringa da tastiera

Per leggere una stringa da tastiera si usa readLine( ) membro di BufferedReader.

String readLine( ) throws IOException

Torna un oggetto String che contiene i caratteri letti. Torna null se si cerca di leggere alla fine dello stream.

Page 68: Programmazione 2 Input Output suStream e File · Input/Output in Java.. Stream Uno stream e’ un’astrazione che produce o consuma informazioni. Uno stream e’ collegato a un devide

.. ES: Leggere una stringa da tastiera// Read a string from console using a BufferedReader.

import java.io.*;

class ReadLines {public static void main(String args[])throws IOException{

// create a BufferedReader using System.in

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

String str;System.out.println("Enter lines of text.");System.out.println("Enter 'stop' to quit.");

do {str = br.readLine();System.out.println(str);

} while(!str.equals("stop"));}

}

Questo esempio mostra l’uso di BufferedReader e del metodo readLine( ).

Il programma legge e mostra linee di testo fino a quando si entra la parola stop.

Page 69: Programmazione 2 Input Output suStream e File · Input/Output in Java.. Stream Uno stream e’ un’astrazione che produce o consuma informazioni. Uno stream e’ collegato a un devide

.. Output da console usando uno stream di caratteriSi puo’ usare System.out per scrivere nella console Java. E’ preferibile usare PrintWriter stream.

PrintWriter e’ una classe character-based.

PrintWriter(OutputStream outputStream, boolean flushOnNewline)outputStream e’ un oggetto di tipo OutputStream e flushOnNewline controlla seJava flushes l’output stream ogni volta che un println( ) e’ chiamato.

Se flushOnNewline e’ true, allora il flushing e’ automatico. Se false, flushing non e’ automatico.

PrintWriter supporta print( ) e println( ) metodi per tutti i tipi in Object. Cosi’, usate questi metodi come in System.out.

Per scrivere nella console si usa PrintWriter, si specifica System.out per output stream e si flush lo stream dopo ogni chiamata a println( ).

Per esempio queste linee di codice creano un PrintWriter che e’ alla console output.PrintWriter pw = new PrintWriter(System.out, true);

Page 70: Programmazione 2 Input Output suStream e File · Input/Output in Java.. Stream Uno stream e’ un’astrazione che produce o consuma informazioni. Uno stream e’ collegato a un devide

..

// Demonstrate PrintWriter.import java.io.*;public class PrintWriterDemo {

public static void main(String args[]) {

PrintWriter pw = new PrintWriter(System.out, true);int i = 10;double d = 123.65;

pw.println("Using a PrintWriter.");pw.println(i);pw.println(d);pw.println(i + " + " + d + " is " + (i+d));

}}

The output from this program is:Using a PrintWriter.10123.6510 + 123.65 is 133.65

Output da console usando uno stream di caratteri

Page 71: Programmazione 2 Input Output suStream e File · Input/Output in Java.. Stream Uno stream e’ un’astrazione che produce o consuma informazioni. Uno stream e’ collegato a un devide

.. File I/O usando uno stream di caratteri

Per costruire file I/O basati su caratteri si usano le classi

FileReader e FileWriter.

Page 72: Programmazione 2 Input Output suStream e File · Input/Output in Java.. Stream Uno stream e’ un’astrazione che produce o consuma informazioni. Uno stream e’ collegato a un devide

..Input da File

La classe FileReader estende la classe InputStreamReader. Viene usata per leggere in modo sequenziale da un file.

I costruttori sono:

public FileReader(String filename)

throws FileNotFoundException

public FileReader(File fp)

Page 73: Programmazione 2 Input Output suStream e File · Input/Output in Java.. Stream Uno stream e’ un’astrazione che produce o consuma informazioni. Uno stream e’ collegato a un devide

..Input da File

Normalmente si utilizza il seguente costruttore, al quale si passa il nome del file:

FileReader reader = new FileReader(“file.txt”);

Se il file non esiste viene generata un’eccezione FileNotFoundException

Page 74: Programmazione 2 Input Output suStream e File · Input/Output in Java.. Stream Uno stream e’ un’astrazione che produce o consuma informazioni. Uno stream e’ collegato a un devide

..Input da File

Il metodo read restituisce un carattere del file per ogni sua invocazione.

Raggiunto il termine del file viene restituito il valore -1

FileReader reader = new FileReader(“file.txt”);

while(true)

{ int i = reader.read();

if (i == -1) break;

char c= (char) i;

}

Public int read() throws IOException

Page 75: Programmazione 2 Input Output suStream e File · Input/Output in Java.. Stream Uno stream e’ un’astrazione che produce o consuma informazioni. Uno stream e’ collegato a un devide

..Esempio 2

import java.io.*;

public class esempio02

{ public static void main(String[] args)

{ int n;

boolean esci=false;

ConsoleReader console = new ConsoleReader();//QUESTA

//CLASSE LA vedremo alla fine della lezione

while(!esci) {

System.out.print("Inserisci il nome del file da

leggere :");

System.out.print(“ (‘FINE’ per uscire) :”);

String nomefile = console.readLine();

if ( nomefile.compareToIgnoreCase(“FINE”)==0)

esci=true;

Il seguente programma mostra come leggere un file di testo. L’output è mandato sul video (standard output)

Page 76: Programmazione 2 Input Output suStream e File · Input/Output in Java.. Stream Uno stream e’ un’astrazione che produce o consuma informazioni. Uno stream e’ collegato a un devide

..Esempio 2

else

{try

{ FileReader filetxt = new FileReader(nomefile);

while ((n=filetxt.read()) !=-1)

System.out.print( (char)n);

filetxt.close();

esci=true;

}

catch(FileNotFoundException e)

{ System.out.println(e);

}

catch(IOException e)

{ System.out.println(e);

System.exit(1);

}

}

}

}

}

Page 77: Programmazione 2 Input Output suStream e File · Input/Output in Java.. Stream Uno stream e’ un’astrazione che produce o consuma informazioni. Uno stream e’ collegato a un devide

..Output su File

La classe FileWriter estende la classe OutputStreamWriter. Viene usata per scrivere in modo sequenziale su un file.

I costruttori sono:

public FileWriter(String filename)

throws IOException

public FileWriter(String filename, boolean append) throws IOException

public FileWriter(File file)

throws IOException

public FileWriter(File file, boolean append)

throws IOException

Page 78: Programmazione 2 Input Output suStream e File · Input/Output in Java.. Stream Uno stream e’ un’astrazione che produce o consuma informazioni. Uno stream e’ collegato a un devide

..Esempio 3

import java.io.*;

public class esempio03

{ public static void main(String[] args)

{ int n;

boolean esci=false

ConsoleReader console = new ConsoleReader();

while(!esci)

{ System.out.print("Inserisci il nome del file di input :");

System.out.print(“ (\”FINE\” per uscire) :”);

String FileIn=console.readLine();

System.out.print("Inserisci il nome del file di output:");

String FileOut=console.readLine();

if(nomefile.comparetoIgnoreCase(“FINE”)==0) esci=true;

Il seguente programma legge un file di testo e lo ricopia in un altro.

Page 79: Programmazione 2 Input Output suStream e File · Input/Output in Java.. Stream Uno stream e’ un’astrazione che produce o consuma informazioni. Uno stream e’ collegato a un devide

..Esempio 3

else

{ try

{ FileReader filein = new FileReader(FileIn);

FileWriter fileout = new FileWriter(FileOut);

while ( (n=filein.read()) !=-1 )

fileout.write( (char)n);

filein.close();

fileout.close();

esci=true; }

catch(FileNotFoundException e)

{ System.out.println(e); }

catch(IOException e)

{ System.out.println(e);

System.exit(1);}

}

}

}

}

Page 80: Programmazione 2 Input Output suStream e File · Input/Output in Java.. Stream Uno stream e’ un’astrazione che produce o consuma informazioni. Uno stream e’ collegato a un devide

.. La classe FileWriter

FileWriter crea un Writer che si puo’ usare per scrivere un file.

FileWriter(String fileName) throws IOException

FileWriter(String fileName, boolean append) throwsIOException

fileName: path name del file.

Se append e’ true, allora l’ output e’ scritto alla fine del file. Altrimenti il file viene sovrascritto.

FileWriter e’ derivato da OutputStreamWriter e Writer. Cosi’, ha accesso ai metodi definiti in queste classi.

Page 81: Programmazione 2 Input Output suStream e File · Input/Output in Java.. Stream Uno stream e’ un’astrazione che produce o consuma informazioni. Uno stream e’ collegato a un devide

.. Es: FileWriter

/* A simple key-to-disk utility that

demonstrates a FileWriter. */

import java.io.*;

class KtoD {

public static void main(String args[])

throws IOException {

String str;

FileWriter fw;

BufferedReader br = new BufferedReader(

new InputStreamReader(System.in));

Legge linee di testo da input da tastiera e le scrive in un file “test.txt.” Il testo e’ letto fino a quando l’utente non scrive stop.

Page 82: Programmazione 2 Input Output suStream e File · Input/Output in Java.. Stream Uno stream e’ un’astrazione che produce o consuma informazioni. Uno stream e’ collegato a un devide

.. FileWriter

try {fw = new FileWriter("test.txt");

}catch(IOException exc) {

System.out.println("Cannot open file.");return ;

}System.out.println("Enter text ('stop' to quit).");

do {System.out.print(": ");str = br.readLine();if(str.compareTo("stop") == 0) break;str = str + "\r\n"; // add newlinefw.write(str);

} while(str.compareTo("stop") != 0);

fw.close();}}

Page 83: Programmazione 2 Input Output suStream e File · Input/Output in Java.. Stream Uno stream e’ un’astrazione che produce o consuma informazioni. Uno stream e’ collegato a un devide

.. La classe FileReader

La classe FileReader crea un Reader per leggere il contenuto di un file.

FileReader(String fileName) throwsFileNotFoundException

fileName: path name del file. Genera un FileNotFoundException se il file non esiste. FileReader e’ derivato da InputStreamReader eReader. Quindi, ha accesso a tutti i metodi definiti da queste classi.

Page 84: Programmazione 2 Input Output suStream e File · Input/Output in Java.. Stream Uno stream e’ un’astrazione che produce o consuma informazioni. Uno stream e’ collegato a un devide

.. ES:FileReader

/* A simple disk-to-screen utility that demonstrates a FileReader. */

import java.io.*;class DtoS {

public static void main(String args[]) throws Exception {FileReader fr = new FileReader("test.txt");BufferedReader br = new BufferedReader(fr);

String s;while((s = br.readLine()) != null) {System.out.println(s);}fr.close();

}}

FileReader e’ incorporato in un BufferedReader. Questo permette di usare readLine( ).

Legge un file di testo “test.txt” e lo mostra in uno stream .

Page 85: Programmazione 2 Input Output suStream e File · Input/Output in Java.. Stream Uno stream e’ un’astrazione che produce o consuma informazioni. Uno stream e’ collegato a un devide

.. Riassumendo—Stream FiltratiFileInputStream e FileOutputStream mettono a disposizione stream di input e di output collegati a un file di byte sul disco.

FileInputStream fin=new FileInputStream(“employee.dat”);

Si puo’ anche usare un oggetto File

File f = new File("employee.dat");

FileInputStream fin = new FileInputStream(f);

Per leggere o scrivere dati corrispondenti ai tipi primitivi di Java si usano le classi DataInputStream e DataOutputStream.

FileInputStream non ha metodi per gestire tipi numerici, DataInputStream non ha un metodo per acquisire i dati da un file.

Page 86: Programmazione 2 Input Output suStream e File · Input/Output in Java.. Stream Uno stream e’ un’astrazione che produce o consuma informazioni. Uno stream e’ collegato a un devide

.. Riassumendo—Stream Filtrati

Alcuni stream servono per ricavare i byte dai file e da sorgenti differenti, altri stream, per esempio DataInputStream o PrintWriter possono assemblare i byte in dati piu’ utili.

Il programmatore deve combinare questi due elementi in quello che viene chiamato stream filtrato, impostando uno stream esistente nel costruttore dell’altro stream.

ES: FileInputStream fin = new FileInputStream("employee.dat"); DataInputStream din = new DataInputStream(fin); double s = din.readDouble();

Page 87: Programmazione 2 Input Output suStream e File · Input/Output in Java.. Stream Uno stream e’ un’astrazione che produce o consuma informazioni. Uno stream e’ collegato a un devide

.. Riassumendo—Stream Filtrati

Gli stream non hanno un buffer. Ogni chiamata di readcontatta il sistema operativo per chiedere un altro byte.

Per costruire uno stream bufferizzato si devono combinare piu’ elementi usando uno stream filtrato:

Es: DataInputStream din = new DataInputStream( new BufferedInputStream( new FileInputStream("employee.dat")));

Page 88: Programmazione 2 Input Output suStream e File · Input/Output in Java.. Stream Uno stream e’ un’astrazione che produce o consuma informazioni. Uno stream e’ collegato a un devide

.. Riassumendo—Stream FiltratiQuando si legge l’input a volte e’ necessario leggere il byte successivo per vedere se si tratta di un valore corrispondente a quello desiderato. In java si usa PushbackInputStream

PushbackInputStream pbin = new PushbackInputStream( new BufferedInputStream( new FileInputStream("employee.dat")));

Per leggere il byte successivo: int b = pbin.read();

Per rifiutarlo se non corrisponde al byte voluto:

if (b != '<') pbin.unread(b);

Per leggere il byte successivo e tipi numerici:

DataInputStream din = new DataInputStream( new PushbackInputStream( new BufferedInputStream( new FileInputStream("employee.dat"))));

Page 89: Programmazione 2 Input Output suStream e File · Input/Output in Java.. Stream Uno stream e’ un’astrazione che produce o consuma informazioni. Uno stream e’ collegato a un devide

.. Riassumendo—Stream Filtrati

La possibilita’ di combinare le classi di filtro per costruire sequenze di stream veramente utili consente tuttavia di avere una grande flessibilita’.

Per esempio si possono leggere i numeri da un file ZIP compresso usando la sequenza di stream:

ZipInputStream zin = new ZipInputStream(new FileInputStream("employee.zip"));

DataInputStream din = new DataInputStream(zin);

Page 90: Programmazione 2 Input Output suStream e File · Input/Output in Java.. Stream Uno stream e’ un’astrazione che produce o consuma informazioni. Uno stream e’ collegato a un devide

.. Stream di File ZIP

Le classi che gestiscono file ZIP si trovano in java.util.zip

Anche se non fanno parte di Java.io, le classi GZIP e ZIP sono sottoclassi di java.io.FilterInputStream e java.io.FilterOutputStream.

Ogni file ZIP ha un’intestazione che contiene informazioni quali il nome del file e il metodo di compressione utilizzato.

Page 91: Programmazione 2 Input Output suStream e File · Input/Output in Java.. Stream Uno stream e’ un’astrazione che produce o consuma informazioni. Uno stream e’ collegato a un devide

..

• Per leggere un file ZIP si utilizza uno ZipInputStreamcombinato con un FilterInputStream.

• Si cercano le vari voci nell’archivio con il metodo getNextEntry il quale restituisce un oggetto ZipEntryche corrisponde alle voci.

• Il metodo read di ZipInputStream viene modificato per restituire -1 alla fine della voce corrente.

• Si chiama closeEntry per leggere la voce successiva.

Stream di File Input ZIP

Page 92: Programmazione 2 Input Output suStream e File · Input/Output in Java.. Stream Uno stream e’ un’astrazione che produce o consuma informazioni. Uno stream e’ collegato a un devide

..

ZipInputStream zin = new ZipInputStream(new FileInputStream(zipname));

ZipEntry entry;while ((entry = zin.getNextEntry()) != null){analyze entry;

read the contents of zin;

zin.closeEntry();}zin.close();

ES: Stream di File Input ZIP

Leggere un file zip

Page 93: Programmazione 2 Input Output suStream e File · Input/Output in Java.. Stream Uno stream e’ un’astrazione che produce o consuma informazioni. Uno stream e’ collegato a un devide

..

BufferedReader in = new BufferedReader(new InputStreamReader(zin));

String s;

while ((s = in.readLine()) != null)do something with s;

ES: Stream di File Input ZIP

Leggere il contenuto di una voce zip

Page 94: Programmazione 2 Input Output suStream e File · Input/Output in Java.. Stream Uno stream e’ un’astrazione che produce o consuma informazioni. Uno stream e’ collegato a un devide

.. Stream di File Output Zip

• Analogamente si costruisce uno stream legato ad un file di output ZipOutputStream• Per ogni voce che si vuole creare nel file zip si crea un oggetto zipEntry.

• Si chiama putNextEntry per iniziare a scrivere un nuovo file.

• Si inviano i dati del file allo stream ZIP.

• Una volta terminato di scrivere si chiama closeEntry.

FileOutputStream fout = new FileOutputStream("test.zip");ZipOutputStream zout = new ZipOutputStream(fout);for all files{

ZipEntry ze = new ZipEntry(filename);zout.putNextEntry(ze);send data to zout;zout.closeEntry();

}zout.close();

Page 95: Programmazione 2 Input Output suStream e File · Input/Output in Java.. Stream Uno stream e’ un’astrazione che produce o consuma informazioni. Uno stream e’ collegato a un devide

..Accesso Random ai file

La classe RandomAccessFile consente di accedere direttamente in un qualunque punto di un File.

Il file viene visto come sequenza di byte, con un indice (file pointer) che identifica la posizione per la successiva operazione di I/O.

Dopo una operazione di I/O, la posizione del file pointer viene aggiornata.

Page 96: Programmazione 2 Input Output suStream e File · Input/Output in Java.. Stream Uno stream e’ un’astrazione che produce o consuma informazioni. Uno stream e’ collegato a un devide

..Accesso Random ai file

Il File pointer può essere spostato dall’utente in una qualsiasi posizione all’interno del file.

Page 97: Programmazione 2 Input Output suStream e File · Input/Output in Java.. Stream Uno stream e’ un’astrazione che produce o consuma informazioni. Uno stream e’ collegato a un devide

..Accesso Random ai file

public RandomAccessFile(String name, String mode)

throws FileNotFoundException

public RandomAccessFile(File fp, String mode)

throws FileNotFoundException

RandomAccessFile non e’ derivata da InputStream o OutputStream. Essa implementa l’interfaccia DataInput and DataOutput, la quale definisce i metodi di I/O.

I costruttori sono:

Page 98: Programmazione 2 Input Output suStream e File · Input/Output in Java.. Stream Uno stream e’ un’astrazione che produce o consuma informazioni. Uno stream e’ collegato a un devide

..Accesso Random ai file

I modi possibili sono:

•“r”: aperto solo in lettura;

•“rw”: aperto in lettura e scrittura;

Se il modo è errato viene lanciato l’eccezione

IllegalArgumentException

Page 99: Programmazione 2 Input Output suStream e File · Input/Output in Java.. Stream Uno stream e’ un’astrazione che produce o consuma informazioni. Uno stream e’ collegato a un devide

..Accesso Random ai file

void close() //Chiude il radom access file e rilascia ogni

//risorsa associata ad esso

long length() //Ritorna la lunghezza del file

long getFilePointer() //Ritorna l’offset attuale del file

void seek(long pos) //Set il file-pointer offset, misurando

//dall’inizio del file al quale la prossima lettura o

//scrittura deve avvenire

int skipBytes(int n) //Salta n bytes di input

I metodi:

Page 100: Programmazione 2 Input Output suStream e File · Input/Output in Java.. Stream Uno stream e’ un’astrazione che produce o consuma informazioni. Uno stream e’ collegato a un devide

..Accesso Random ai file

intintintint readreadreadread()//Legge un byte dal file()//Legge un byte dal file()//Legge un byte dal file()//Legge un byte dal file

intintintint read(byte b[]) //Legge read(byte b[]) //Legge read(byte b[]) //Legge read(byte b[]) //Legge b.lenghtb.lenghtb.lenghtb.lenght byte da questo file e byte da questo file e byte da questo file e byte da questo file e li mette in un li mette in un li mette in un li mette in un arrayarrayarrayarray di bytedi bytedi bytedi byte

intintintint read(byte b[], int off, int read(byte b[], int off, int read(byte b[], int off, int read(byte b[], int off, int lenlenlenlen) //Legge ) //Legge ) //Legge ) //Legge lenlenlenlen byte dal byte dal byte dal byte dal file e li mette in un file e li mette in un file e li mette in un file e li mette in un arrayarrayarrayarray iniziando da offiniziando da offiniziando da offiniziando da off

booleanbooleanbooleanboolean readBooleanreadBooleanreadBooleanreadBoolean()()()()

byte byte byte byte readBytereadBytereadBytereadByte()()()()

charcharcharchar readCharreadCharreadCharreadChar() //Legge un () //Legge un () //Legge un () //Legge un UnicodeUnicodeUnicodeUnicode caratterecaratterecaratterecarattere

doubledoubledoubledouble readDoublereadDoublereadDoublereadDouble()()()()

floatfloatfloatfloat readFloatreadFloatreadFloatreadFloat()()()()

intintintint readIntreadIntreadIntreadInt()()()()

StringStringStringString readLinereadLinereadLinereadLine() //Legge la prossima linea di testo dal () //Legge la prossima linea di testo dal () //Legge la prossima linea di testo dal () //Legge la prossima linea di testo dal filefilefilefile

short short short short readShortreadShortreadShortreadShort() //() //() //() // Legge un 16Legge un 16Legge un 16Legge un 16----bit con segno numerobit con segno numerobit con segno numerobit con segno numero

I metodi di lettura:

Page 101: Programmazione 2 Input Output suStream e File · Input/Output in Java.. Stream Uno stream e’ un’astrazione che produce o consuma informazioni. Uno stream e’ collegato a un devide

..Accesso Random ai file

voidvoidvoidvoid writewritewritewrite(byte b[]) //Scrive (byte b[]) //Scrive (byte b[]) //Scrive (byte b[]) //Scrive b.lenghtb.lenghtb.lenghtb.lenght bytesbytesbytesbytes dalldalldalldall’’’’arrayarrayarrayarray//al file iniziando dalla posizione corrente del file //al file iniziando dalla posizione corrente del file //al file iniziando dalla posizione corrente del file //al file iniziando dalla posizione corrente del file //pointer.//pointer.//pointer.//pointer.

void write(byte b[], void write(byte b[], void write(byte b[], void write(byte b[], intintintint off, off, off, off, intintintint lenlenlenlen) //Scrive ) //Scrive ) //Scrive ) //Scrive lenlenlenlen byte byte byte byte //dall//dall//dall//dall’’’’arrayarrayarrayarray iniziando da offset di questo fileiniziando da offset di questo fileiniziando da offset di questo fileiniziando da offset di questo file

voidvoidvoidvoid writewritewritewrite((((intintintint b) //b) //b) //b) // Scrive il byte b nel fileScrive il byte b nel fileScrive il byte b nel fileScrive il byte b nel file

I metodi di scrittura:

Page 102: Programmazione 2 Input Output suStream e File · Input/Output in Java.. Stream Uno stream e’ un’astrazione che produce o consuma informazioni. Uno stream e’ collegato a un devide

..Accesso Random ai file

void writeBoolean(boolean v)

void writeByte(int v)

void writeBytes(String s) //scrive la stringa in un file //come sequenza di bytes

void writeChar(int v)

void writeDouble(double v)

void writeFloat(float v)

void writeInt(int v)

void writeLong(long v)

void writeShort(int v)

I metodi di scrittura:

Page 103: Programmazione 2 Input Output suStream e File · Input/Output in Java.. Stream Uno stream e’ un’astrazione che produce o consuma informazioni. Uno stream e’ collegato a un devide

..

RandomAccessDemo.java

Il programma scrive 6 double in un file e poi li legge in un ordine non sequenziale

L’output:

First value is 19.4

Second value is 10.1

Fourth value is 33.0

Here is every other value:

19.4 123.54 87.9

Es: Accesso Random ai file

Page 104: Programmazione 2 Input Output suStream e File · Input/Output in Java.. Stream Uno stream e’ un’astrazione che produce o consuma informazioni. Uno stream e’ collegato a un devide

..Accesso Random ai file

Tutti i metodi precedenti possono lanciare l’eccezione IOExceptionIOExceptionIOExceptionIOException.

Inoltre nei S.O multiutente è necessario gestire l’eccezione SecurityExceptionSecurityExceptionSecurityExceptionSecurityException, generata da accessi non consentiti per motivi di protezione.

Page 105: Programmazione 2 Input Output suStream e File · Input/Output in Java.. Stream Uno stream e’ un’astrazione che produce o consuma informazioni. Uno stream e’ collegato a un devide

.. StringTokenized e testo delimitato

Quando si legge una riga di input, si acquisisce una singola stringa lunga, che si vuole suddividere in stringhe individuali (token).

La classe da utilizzare StringTokenizer class in java.util.

Bisogna specificare uno o piu’ delimitatore (es. ‘|’ ), per default " \t\n\r", (space, tab, newline, e carriage return)

StringTokenizer tokenizer = new StringTokenizer(line, "|");

StringTokenizer tokenizer = new StringTokenizer(line, "|,;");

while (tokenizer.hasMoreTokens()){String token = tokenizer.nextToken();process token

}

Page 106: Programmazione 2 Input Output suStream e File · Input/Output in Java.. Stream Uno stream e’ un’astrazione che produce o consuma informazioni. Uno stream e’ collegato a un devide

.. StringTokenized e testo delimitato

Un’alternativa a StringTokenizer e’ il metodo di suddivisione split della classe String.

line.split("[|,;]") ritorna un array String[] con tutti i tokenpresenti nella stringa usando come delimitatori presenti tra le parentesi quadre.

Page 107: Programmazione 2 Input Output suStream e File · Input/Output in Java.. Stream Uno stream e’ un’astrazione che produce o consuma informazioni. Uno stream e’ collegato a un devide

..Stream di Oggetti

Se si desidera salvare file che contengono dei dati strutturati si utilizza il meccanismo di serializzazione degli oggetti che ne automatizza quasi completamente la gestione.

La classe che si desidera leggere/scrivere come uno streamdi oggetti deve implementare l’interfaccia SerializableSerializableSerializableSerializable:

ClassClassClassClass xxxxx implementsimplementsimplementsimplements SerializableSerializableSerializableSerializable { { { { ………… }}}}

L’interfaccia SerializableSerializableSerializableSerializable non dispone di alcun metodo, per cui non serve modificare la classe in alcun modo.

Page 108: Programmazione 2 Input Output suStream e File · Input/Output in Java.. Stream Uno stream e’ un’astrazione che produce o consuma informazioni. Uno stream e’ collegato a un devide

..Scrittura di oggetti

Per salvare i dati di un oggetto è necessario aprire un oggetto ObjectOutputStreamObjectOutputStreamObjectOutputStreamObjectOutputStream:

ObjectOutputStreamObjectOutputStreamObjectOutputStreamObjectOutputStream out = new out = new out = new out = new ObjectOutputStreamObjectOutputStreamObjectOutputStreamObjectOutputStream (new (new (new (new FileOutputStreamFileOutputStreamFileOutputStreamFileOutputStream((((nomefilenomefilenomefilenomefile, , , , true/false););););

Il valore del parametro booleano indica o meno la condizione di append.

Per salvare un oggetto si utilizza il metodo WriteObjectWriteObjectWriteObjectWriteObject:

xxxxx p1 = new xxxxx(…);

Out.WriteObject(p1);

Page 109: Programmazione 2 Input Output suStream e File · Input/Output in Java.. Stream Uno stream e’ un’astrazione che produce o consuma informazioni. Uno stream e’ collegato a un devide

..Lettura di Oggetti

Per rileggere gli oggetti bisogna innanzitutto avere un oggetto ObjectInputStream:

ObjectInputStreamObjectInputStreamObjectInputStreamObjectInputStream in = new in = new in = new in = new ObjectInputStreamObjectInputStreamObjectInputStreamObjectInputStream(new (new (new (new FileInputStreamFileInputStreamFileInputStreamFileInputStream((((nomefilenomefilenomefilenomefile););););

Per recuperare gli oggetti nello stesso ordine in cui sono statiscritti si utilizza il metodo ReadObjectReadObjectReadObjectReadObject()()()():

xxxxx p1 = (xxxxx) in.ReadObject()

La chiusura di uno stream sia di input che di output si realizza mediante il metodo closeclosecloseclose()()()()

Page 110: Programmazione 2 Input Output suStream e File · Input/Output in Java.. Stream Uno stream e’ un’astrazione che produce o consuma informazioni. Uno stream e’ collegato a un devide

..Esempio

Lettura/Scrittura di un file strutturato: “Data la classe Person, contenente informazioni anagrafiche degli studenti di questo corso, realizzare un programma che generi un file strutturato contenente 100 records.

Prevedere una fase di lettura e di stampa a video del contenuto del file.

Page 111: Programmazione 2 Input Output suStream e File · Input/Output in Java.. Stream Uno stream e’ un’astrazione che produce o consuma informazioni. Uno stream e’ collegato a un devide

.. La gestione dei File

Abbiamo visto come leggere e scrivere i dati in un file.

Le classi Stream riguardano appunto il contenuto dei file.

La classe File incapsula le funzionalita’ necessarie per lavorare con il file system del computer dell’utente.

La classe File ha a che fare con la memorizzazione del file sul disco.

Page 112: Programmazione 2 Input Output suStream e File · Input/Output in Java.. Stream Uno stream e’ un’astrazione che produce o consuma informazioni. Uno stream e’ collegato a un devide

..La classe FILE

La classe File e gli attributi di directory e file, consentono di accedere alle directory, verificare e acquisire le caratteristiche dei file presenti, cambiarne gli attributi, cancellare e rinominare file.

Il metodo costruttore File(File(File(File(StringStringStringString nome) nome) nome) nome)

• fornisce un oggetto file con il nome assegnato posto nella directory corrente.

• Una chiamata di questo costruttore non crea un file con il nome assegnato, se il file non esiste

• Se si vuole creare un nuovo file si deve usare createNewFile della classe File.

Il metodo costruttore File(File(File(File(StringStringStringString pathnamepathnamepathnamepathname, , , , StringStringStringString namenamenamename))))

• fornisce un oggetto file con il nome assegnato posto nella directory specificata

Page 113: Programmazione 2 Input Output suStream e File · Input/Output in Java.. Stream Uno stream e’ un’astrazione che produce o consuma informazioni. Uno stream e’ collegato a un devide

.. La classe File

Il metodo costruttore File(File(File(File(FileFileFileFile dir, dir, dir, dir, StringStringStringString namenamenamename))))

• fornisce un oggetto file con il nome assegnato posto nella directory specificata

• Se dir e’ null allora lo crea nella directory corrente

Page 114: Programmazione 2 Input Output suStream e File · Input/Output in Java.. Stream Uno stream e’ un’astrazione che produce o consuma informazioni. Uno stream e’ collegato a un devide

..La classe FILE

boolean exists() Verifica l’esistenza del file con cui èinvocata.

boolean canRead() Verifica se il file è di sola lettura.

boolean canWrite() Verifica se il file ha i permessi di lettura e scrittura.

boolean isDirectory() Verifica se si tratta di Directory

boolean isFile() Verifica se si tratta di File

boolean isHidden() Verifica se il File è nascosto.

String getAbsolutePath() Restituisce una stringa con il path completo del file.

String getName() Restituisce una stringa con il nome del File.

String getParent() Restituisce una stringa con il solo path del file.

String[] list() Restituisce un array di stringhe con tutti i file e le sottodirectory se invocato con un

nome di directory.

Page 115: Programmazione 2 Input Output suStream e File · Input/Output in Java.. Stream Uno stream e’ un’astrazione che produce o consuma informazioni. Uno stream e’ collegato a un devide

..La classe FILE

Metodi di settaggio

boolean createNewFile() Crea un file vuoto. Il boolean è true se l’operazione ha avuto successo.

boolean delete() Cancella il file.

void deleteOnExit() Setta il file per la sua cancellazione all’uscita dal programma.

boolean mkdir() Crea una directory

boolean renameTo(File) Rinomina il file invocante con il nome del parametro.

boolean setReadOnly() Setta il file in sola lettura. Il boolean è truese l’operazione è riuscita.

Page 116: Programmazione 2 Input Output suStream e File · Input/Output in Java.. Stream Uno stream e’ un’astrazione che produce o consuma informazioni. Uno stream e’ collegato a un devide

..Esempio File01

Il programma acquisisce due stringhe corrispondenti al nome di una Directory e ad una estensione e stampa la lista dei file della Directory che hanno l'estensione desiderata

import java.io.*;

class esempio_File01 {

public static void main(String arg[]) {

String nome="", est="";

boolean c=false;

if (arg.length>=1) nome=arg[0];

if (arg.length>=2) est=arg[1];

File f= new File(nome);

if (!f.exists())

System.out.println("Non esiste la directory "+nome);

Page 117: Programmazione 2 Input Output suStream e File · Input/Output in Java.. Stream Uno stream e’ un’astrazione che produce o consuma informazioni. Uno stream e’ collegato a un devide

..Esempio File01

File a[]=f.listFiles();

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

String s=a[i].toString();

s=s.substring(s.length()-4);

boolean b=(s.equalsIgnoreCase(est));

if ((a[i].isFile()) && b) {

c=true;

System.out.println(a[i].getName());

}

}

if (!c) System.out.println("Nessun file trovato....");

}

}

Page 118: Programmazione 2 Input Output suStream e File · Input/Output in Java.. Stream Uno stream e’ un’astrazione che produce o consuma informazioni. Uno stream e’ collegato a un devide

..La classe ConsoleReader

import java.io.*;

public class ConsoleReader

{ private BufferedReader reader;

public ConsoleReader()

{reader=newBufferedReader(new InputStreamReader(System.in));

}

public String readLine()

{ String inputLine=””;

try

{ inputLine = reader.readLine();

}

catch(IOException e)

{ System.out.println(e);

System.exit(1);

}

return inputLine;

}

Page 119: Programmazione 2 Input Output suStream e File · Input/Output in Java.. Stream Uno stream e’ un’astrazione che produce o consuma informazioni. Uno stream e’ collegato a un devide

..La classe ConsoleReader

public int readInt ()

{ String inputString = readLine();

int n = Integer.parseInt(inputString);

return n;

}

public double readDouble ()

{ String inputString = readLine();

double x = Double.parseDouble(inputString);

return x;

}

}

Page 120: Programmazione 2 Input Output suStream e File · Input/Output in Java.. Stream Uno stream e’ un’astrazione che produce o consuma informazioni. Uno stream e’ collegato a un devide

..Esempio 1

public class esempio01

{ public static void main(String[] args)

{ int i;

ConsoleReader console = new ConsoleReader();

System.out.print("inserisci un numero intero :");

int n=console.readInt();

System.out.print("inserisci un numero reale :");

double x=console.readDouble();

for(i=1;i<=n;i++)

System.out.println(x*i);

}

}

Il seguente programma mostra come utilizzare la classe appena descritta:

Page 121: Programmazione 2 Input Output suStream e File · Input/Output in Java.. Stream Uno stream e’ un’astrazione che produce o consuma informazioni. Uno stream e’ collegato a un devide

.. Input e Output—La classe Scanner

Per visualizzare un messaggio sullo stream di output basta chiamare il metodo System.out.println

Prima di JDK 5.0 non esisteva un metodo altrettanto semplice per leggere l’input.

Per Leggere l’input dalla console si deve creare uno Scanner collegato allo “stream di input standart”System.in.

Scanner in = new Scanner(System.in);

Page 122: Programmazione 2 Input Output suStream e File · Input/Output in Java.. Stream Uno stream e’ un’astrazione che produce o consuma informazioni. Uno stream e’ collegato a un devide

.. Input—La classe Scanner

Per leggere una linea di input:

System.out.print("What is your name? ");

String name = in.nextLine();

Per leggere una singola parola

String firstName = in.next();

Per leggere un intero

System.out.print("How old are you? ");

int age = in.nextInt();

Page 123: Programmazione 2 Input Output suStream e File · Input/Output in Java.. Stream Uno stream e’ un’astrazione che produce o consuma informazioni. Uno stream e’ collegato a un devide

.. Formattare l’output

System.out.printf("Hello, %s. Next year, you'll be %d", name, age);

d decimale

x esadecimale

b boolean

c carattere

s String

Page 124: Programmazione 2 Input Output suStream e File · Input/Output in Java.. Stream Uno stream e’ un’astrazione che produce o consuma informazioni. Uno stream e’ collegato a un devide

.. Ambienti di Sviluppo e Debugging

Page 125: Programmazione 2 Input Output suStream e File · Input/Output in Java.. Stream Uno stream e’ un’astrazione che produce o consuma informazioni. Uno stream e’ collegato a un devide

..

Man mano che la struttura di un programma si fa piùcomplessa (utilizzo di molteplici classi e gerarchie) sono sempre maggiori le probabilità di commettere degli errori.

Gli errori di sintassi vengono rilevati direttamente dal compilatore.

Scovare gli errori a run-time (manualmente) può diventare un’impresa ardua.

Il Debugger

Page 126: Programmazione 2 Input Output suStream e File · Input/Output in Java.. Stream Uno stream e’ un’astrazione che produce o consuma informazioni. Uno stream e’ collegato a un devide

.. Il Debugger

La maniera più semplice per “esplorare” il comportamento di un programma durante la sua esecuzione è quella di stampare sul terminale i valori delle variabili “critiche”.

Uno strumento di lavoro che consente di “investigare” un programma in modo semplice e pulito è il debugger: Uno strumento software che permette di individuare i "bugs".

Il debugger a sua volta manda in esecuzione appositi programmi in maniera da sorvegliarne il funzionamento fermandone per esempio l'esecuzione in un dato punto e analizzandone il contenuto rispetto a variabili, classi, threads, ecc.

Page 127: Programmazione 2 Input Output suStream e File · Input/Output in Java.. Stream Uno stream e’ un’astrazione che produce o consuma informazioni. Uno stream e’ collegato a un devide

.. Esempi di debugger

JDB – Debugger a linea di comando. E’ distribuito insieme all’SDK JAVA;

JSWAT – Debugger grafico, rilasciato sotto licenza GNU –Sito web e documentazione:

http://www.bluemarsh.com/java/jswat/

Page 128: Programmazione 2 Input Output suStream e File · Input/Output in Java.. Stream Uno stream e’ un’astrazione che produce o consuma informazioni. Uno stream e’ collegato a un devide

.. JDB

Il debugger Java. E’ necessario compilare con javac -g . Per farlo partire digitare: jdb Nomeclass - Le principali istruzioni sono:

Per inserire un breakpoint all'inizio del main:stop in stop in stop in stop in Nomeclasse.mainNomeclasse.mainNomeclasse.mainNomeclasse.main

Per inserire un breakpoint all'inizio di un metodo:stop in Nomeclasse.nomemetodo stop in Nomeclasse.nomemetodo stop in Nomeclasse.nomemetodo stop in Nomeclasse.nomemetodo

Per far partire l'esecuzione:runrunrunrun

Per far continuare l'esecuzione:contcontcontcont

Per listare le istruzioni vicino a quella in esecuzione:list list list list

Page 129: Programmazione 2 Input Output suStream e File · Input/Output in Java.. Stream Uno stream e’ un’astrazione che produce o consuma informazioni. Uno stream e’ collegato a un devide

.. JDB

Per listare l'istruzione n e seguenti:list nlist nlist nlist n

Per creare un breakpoint alla riga n: stop at Nomeclasse:nstop at Nomeclasse:nstop at Nomeclasse:nstop at Nomeclasse:n

Per stampare una variabile:print variabileprint variabileprint variabileprint variabile

Per stampare tutte le variabili locali:localslocalslocalslocals

Per eseguire la prossima istruzione:stepstepstepstep

Per eseguire la prossima istruzione senza saltare all'interno di un metodo: nextnextnextnext

Page 130: Programmazione 2 Input Output suStream e File · Input/Output in Java.. Stream Uno stream e’ un’astrazione che produce o consuma informazioni. Uno stream e’ collegato a un devide

..Altri comandi….

per uscireexitexitexitexit

fornisce la sintassi dei comandi del debugger

help help help help ancheancheancheanche ????

ripete l'ultimo comando (unix-like)!!!!!!!!

elimina il breakpoint alla lineaclear clear clear clear classe:lineaclasse:lineaclasse:lineaclasse:linea

stampa tutte le informazionidell'oggetto

dump dump dump dump nome/inome/inome/inome/i

riprende thread sospesiresumeresumeresumeresume [[[[thread_idthread_idthread_idthread_id (s)](s)](s)](s)]

sospende il/i threadsuspend [suspend [suspend [suspend [thread_idthread_idthread_idthread_id (s)](s)](s)](s)]

imposta al thread desideratothread thread thread thread thread_idthread_idthread_idthread_id

elenca i threadthreads [threads [threads [threads [threadgroupthreadgroupthreadgroupthreadgroup]]]]

Page 131: Programmazione 2 Input Output suStream e File · Input/Output in Java.. Stream Uno stream e’ un’astrazione che produce o consuma informazioni. Uno stream e’ collegato a un devide

..JSWAT

Page 132: Programmazione 2 Input Output suStream e File · Input/Output in Java.. Stream Uno stream e’ un’astrazione che produce o consuma informazioni. Uno stream e’ collegato a un devide

.. IDE –Ambienti di Sviluppo

Spesso risulta utile affidarsi ad un ambiente di sviluppo completo, in grado di offrire oltre al debugging integrato anche una serie di servizi aggiuntivi quali per esempio:

- editing avanzato;

- supporto multi-classe;

- wizard per interfacce grafiche;

- generazione automatica della documentazione;

- …

In generale tali software prendono il nome di IDE (Integrated Development Environment).

Page 133: Programmazione 2 Input Output suStream e File · Input/Output in Java.. Stream Uno stream e’ un’astrazione che produce o consuma informazioni. Uno stream e’ collegato a un devide

.. IDE –Ambienti di Sviluppo

NetBeans – open source; http://www.netbeans.org/index_it.html

Jbuilder ($$)

http://www.borland.com/jbuilder/

JCreator ($$) - http://www.jcreator.com/index.htm

Eclipse (free) - http://www.eclipse.org/

Page 134: Programmazione 2 Input Output suStream e File · Input/Output in Java.. Stream Uno stream e’ un’astrazione che produce o consuma informazioni. Uno stream e’ collegato a un devide

.. L’ambiente di sviluppo

Un editor:

In ambiente Linux troverete diversi ambienti testo quali Vi o Emacs o Scite(XEmacs).

Emacs e’ un ambiente integrato mediante il quale si può anche effettuare la compilazione ed il debugging del programma.

Page 135: Programmazione 2 Input Output suStream e File · Input/Output in Java.. Stream Uno stream e’ un’astrazione che produce o consuma informazioni. Uno stream e’ collegato a un devide

.. Emacs

Da shell digitare il comando emacs [nome file]se questo è seguito dal simbolo &Il sistema manda l’esecuzione del comando in background ritornandoil controllo del prompt all’utente

Page 136: Programmazione 2 Input Output suStream e File · Input/Output in Java.. Stream Uno stream e’ un’astrazione che produce o consuma informazioni. Uno stream e’ collegato a un devide

.. Emacs

Emacs, sviluppato originariamente da Richard Stallman nel 1976, è un editor molto popolare fra i programmatori.

In Emacs distinguiamo due tipologie di comandi generali:CONTROL “CTRL-x” comando

ESC-x meta-comando

(alternativamente ALT-x)

Page 137: Programmazione 2 Input Output suStream e File · Input/Output in Java.. Stream Uno stream e’ un’astrazione che produce o consuma informazioni. Uno stream e’ collegato a un devide

.. Alcuni comandi Emacs

ESC v Cursore su una pagina

CTRL-vCursore giù una pagina

CTRL-aCursore a inizio riga

CTRL-eCursore a fine riga

CTRL-x CTRL-c Quit da emacs

CTRL-lRefresh della finestra

CTRL-x 1 Riunifica la finestra

CTRL-x o Passa da una metà all'altra

CTRL-x 2 Divide la finestra in due

CTRL-x k Chiude un buffer

CTRL-x b Passa ad un altro buffer

CTRL-x i nome Inserisce un file

CTRL-x CTRL-f nome Apre un nuovo file

CTRL-x CTRL-w nome Salva con nome diverso

CTRL-x CTRL-s Salva il file

CTRL-x u oppure CTRL-_Undo

ESC x doctorAiuto psicologico

ESC x shell Apre una shell dentro emacs

CTRL-h b Significato di tutti i tasti

CTRL-h k tasto Significato di un tasto

CTRL-h CTRL-hPagina di aiuto

CTRL-yIncolla blocco

ALT-w Marca fine blocco e copia

CTRL-wMarca fine blocco e taglia

CTRL-SPACE Marca inizio di un blocco

ESC % testo1 testo2 Sostituisce testo

CTRL-s testoCerca testo

ESC x goto-line numero Vai alla linea...

ESC > Fine del buffer

ESC < Inizio del buffer

Page 138: Programmazione 2 Input Output suStream e File · Input/Output in Java.. Stream Uno stream e’ un’astrazione che produce o consuma informazioni. Uno stream e’ collegato a un devide

.. Alcuni comandi Emacs

ESC v Cursore su una pagina

CTRL-vCursore giù una pagina

CTRL-aCursore a inizio riga

CTRL-eCursore a fine riga

CTRL-x CTRL-c Quit da emacs

CTRL-lRefresh della finestra

CTRL-x 1 Riunifica la finestra

CTRL-x o Passa da una metà all'altra

CTRL-x 2 Divide la finestra in due

CTRL-x k Chiude un buffer

CTRL-x b Passa ad un altro buffer

CTRL-x i nome Inserisce un file

CTRL-x CTRL-f nome Apre un nuovo file

CTRL-x CTRL-w nome Salva con nome diverso

CTRL-x CTRL-s Salva il file

CTRL-x u oppure CTRL-_Undo

ESC x doctorAiuto psicologico

ESC x shell Apre una shell dentro emacs

CTRL-h b Significato di tutti i tasti

CTRL-h k tasto Significato di un tasto

CTRL-h CTRL-hPagina di aiuto

CTRL-yIncolla blocco

ALT-w Marca fine blocco e copia

CTRL-wMarca fine blocco e taglia

CTRL-SPACE Marca inizio di un blocco

ESC % testo1 testo2 Sostituisce testo

CTRL-s testoCerca testo

ESC x goto-line numero Vai alla linea...

ESC > Fine del buffer

ESC < Inizio del buffer

Page 139: Programmazione 2 Input Output suStream e File · Input/Output in Java.. Stream Uno stream e’ un’astrazione che produce o consuma informazioni. Uno stream e’ collegato a un devide

.. EMACS

Page 140: Programmazione 2 Input Output suStream e File · Input/Output in Java.. Stream Uno stream e’ un’astrazione che produce o consuma informazioni. Uno stream e’ collegato a un devide

.. Hello World

Usando la combinazione di tasti “ALT-x” siAccede ai meta-comandi Emacs.

Digitando: font-lock-modeSi abilita la colorazione del testo

Page 141: Programmazione 2 Input Output suStream e File · Input/Output in Java.. Stream Uno stream e’ un’astrazione che produce o consuma informazioni. Uno stream e’ collegato a un devide

.. JDE

JDEE (Java Development Environment for Emacs) è un pacchetto Emacs scritto in linguaggio Lisp che consente ad Emacs di interaggire con tool per lo sviluppo di applicazioni Java. Come risultato JDE rende Emacs un ambiente di sviluppo integrato (integrated development environment (IDE)).

Page 142: Programmazione 2 Input Output suStream e File · Input/Output in Java.. Stream Uno stream e’ un’astrazione che produce o consuma informazioni. Uno stream e’ collegato a un devide

.. Eclipse

Page 143: Programmazione 2 Input Output suStream e File · Input/Output in Java.. Stream Uno stream e’ un’astrazione che produce o consuma informazioni. Uno stream e’ collegato a un devide

.. NetBeans

Page 144: Programmazione 2 Input Output suStream e File · Input/Output in Java.. Stream Uno stream e’ un’astrazione che produce o consuma informazioni. Uno stream e’ collegato a un devide

.. Ancora esempi ed esercizi

Page 145: Programmazione 2 Input Output suStream e File · Input/Output in Java.. Stream Uno stream e’ un’astrazione che produce o consuma informazioni. Uno stream e’ collegato a un devide

..Esempio 4

import java.io.*;

public class esempio04

{ public static void main(String[] args)

{ ConsoleReader console = new ConsoleReader();

FileReader filein=null;

boolean continua = true;

Il seguente programma è simile all’esempio 3, ma gestisce l’eccezione di FileNotFound.

Page 146: Programmazione 2 Input Output suStream e File · Input/Output in Java.. Stream Uno stream e’ un’astrazione che produce o consuma informazioni. Uno stream e’ collegato a un devide

..Esempio 4

do

{ continua=true;

try

{ System.out.print("Inserisci il nome del file di

input :");

String FileIn=console.readLine();

filein = new FileReader(FileIn);

}

catch(FileNotFoundException e)

{ System.out.println("Il file non esiste");

continua=false;

}

} while(!continua);

Page 147: Programmazione 2 Input Output suStream e File · Input/Output in Java.. Stream Uno stream e’ un’astrazione che produce o consuma informazioni. Uno stream e’ collegato a un devide

..Esempio 4

try

{ int n;

System.out.print("Inserisci il nome del file di output

:");

String FileOut=console.readLine();

FileWriter fileout = new FileWriter(FileOut);

while ((n=filein.read()) !=-1)

fileout.write( (char)n);

filein.close();

fileout.close();

}

catch(IOException e)

{ System.out.println(e);

System.exit(1);

}

}

}

Page 148: Programmazione 2 Input Output suStream e File · Input/Output in Java.. Stream Uno stream e’ un’astrazione che produce o consuma informazioni. Uno stream e’ collegato a un devide

..Esempio 5

Il seguente programma ricopia un file in un altro in ordine inverso.

import java.io.*;

// legge un file carattere per carattere e lo trascrive

// in ordine inverso nel file di destinazione

public class esempio05

{ public static void main(String[] args)

{ ConsoleReader console = new ConsoleReader();

RandomAccessFile filein=null;

RandomAccessFile fileout=null;

boolean continua;

Page 149: Programmazione 2 Input Output suStream e File · Input/Output in Java.. Stream Uno stream e’ un’astrazione che produce o consuma informazioni. Uno stream e’ collegato a un devide

..Esempio 5

do

{ continua=false;

System.out.print("Inserisci ilnomedel file di input:");

String FileIn=console.readLine();

try

{ filein = new RandomAccessFile(FileIn, "r");

}

catch(FileNotFoundException e)

{ System.out.println("Il file non esiste");

continua=true;

}

} while(continua);

Page 150: Programmazione 2 Input Output suStream e File · Input/Output in Java.. Stream Uno stream e’ un’astrazione che produce o consuma informazioni. Uno stream e’ collegato a un devide

..Esempio 5

System.out.print("Inserisci il nome del file di output :");

String FileOut=console.readLine();

try

{ fileout = new RandomAccessFile(FileOut, "rw");

}

catch(IOException e)

{

System.out.println("Errore nell'apertura del file di output");

System.out.println(e);

System.exit(1);

}

Page 151: Programmazione 2 Input Output suStream e File · Input/Output in Java.. Stream Uno stream e’ un’astrazione che produce o consuma informazioni. Uno stream e’ collegato a un devide

..Esempio 5

try{ long pos;

int n;for ( pos =filein.length();pos>0; --pos)

{filein.seek(pos-1);n = filein.read();fileout.writeByte((char) n);}

filein.close();fileout.close();

}catch(IOException e){ System.out.println(e);

System.exit(1);}

}}

Page 152: Programmazione 2 Input Output suStream e File · Input/Output in Java.. Stream Uno stream e’ un’astrazione che produce o consuma informazioni. Uno stream e’ collegato a un devide

..Esercizi

Creazione di un file - Esercizio 1: “Realizzare un programma che generi in un ciclo 150 numeri da 1000 a

1149 e dopo averli trasformati in stringa li scriva su una

singola riga del file.”

Appendere righe a un file - Esercizio 2: “Realizzare un programma che aggiunga al precedente file di testo altri 50

numeri da 1150 a 1199 e li scriva in coda al file esistente.”

In entrambi i casi prevedere un metodo stampa() a video per la verifica;

Page 153: Programmazione 2 Input Output suStream e File · Input/Output in Java.. Stream Uno stream e’ un’astrazione che produce o consuma informazioni. Uno stream e’ collegato a un devide

..Esercizi

File Dati – Esercizio 3: “Realizzare un programma che

generi in un ciclo 45 numeri da 10000 a 10044 e li scriva su

un file di dati.”