Lezione 14 Lettura e scrittura di file Programmazione

  • Slides: 19
Download presentation
Lezione 14 Lettura e scrittura di file Programmazione per la Musica | Prof. Luca

Lezione 14 Lettura e scrittura di file Programmazione per la Musica | Prof. Luca A. Ludovico

Leggere e scrivere file in Java • Obiettivo della lezione è saper aprire in

Leggere e scrivere file in Java • Obiettivo della lezione è saper aprire in lettura e scrittura file binari. • Possibili applicazioni: import/export di contenuti musicali rispetto a strutture dati interne, salvataggio della configurazione, interfacciamento con altri sistemi, … • Il primo passaggio è istanziare un oggetto della classe File, dopodiché è possibile istanziare un oggetto della classe Buffered. Reader che prende questo file come argomento in ingresso. Programmazione per la Musica - Prof. Luca A. Ludovico 14. Lettura e scrittura di file

La classe File • La classe File fornisce una rappresentazione astratta del percorso (pathname)

La classe File • La classe File fornisce una rappresentazione astratta del percorso (pathname) di una cartella (directory) o di un documento (file). • Sistemi operativi e interfacce utilizzano stringhe dipendenti dal sistema in uso. Questa classe mette a disposizione un’astrazione comunque gerarchica ma indipendente dal sistema. • Esempio: nei percorsi si usa il separatore “/” in Unix, ma Windows ammette anche “” Programmazione per la Musica - Prof. Luca A. Ludovico 14. Lettura e scrittura di file

La classe File • Un percorso può essere assoluto o relativo. Quando è assoluto,

La classe File • Un percorso può essere assoluto o relativo. Quando è assoluto, contiene intrinsecamente tutte le informazioni per localizzare un file. Se invece è relativo, deve essere interpretato sulla base di altre informazioni. • Di default, le classi nel package java. io risolvono i percorsi relativi rispetto alla directory corrente. Tipicamente, si tratta della cartella in cui si invoca la Java Virtual Machine. – In Net. Beans, il path relative fa riferimento alla cartella del progetto, ad esempio Java. Application 1. Programmazione per la Musica - Prof. Luca A. Ludovico 14. Lettura e scrittura di file

Costruttori e metodi della classe File • Costruttori: File(String pathname), File(URI uri), … •

Costruttori e metodi della classe File • Costruttori: File(String pathname), File(URI uri), … • boolean can. Execute() • boolean can. Read() • boolean can. Write() testano i permessi da parte dell’applicazione • boolean delete() • void delete. On. Exit() cancellano il file o la cartella, istantaneamente o alla chiusura della virtual machine Programmazione per la Musica - Prof. Luca A. Ludovico 14. Lettura e scrittura di file

Verifica dell’esistenza • Nella lettura di file, la principale problematica da gestire è il

Verifica dell’esistenza • Nella lettura di file, la principale problematica da gestire è il fatto che si tratti realmente di un file. • Il modo più semplice è invocare il metodo boolean is. File(), ed esiste anche boolean is. Directory() • In alternativa, il metodo boolean File. exists() verifica se il file o la directory esistono. Programmazione per la Musica - Prof. Luca A. Ludovico 14. Lettura e scrittura di file

Altri metodi della classe File • La classe File mette a disposizione un gran

Altri metodi della classe File • La classe File mette a disposizione un gran numero di metodi per gestire documenti e cartelle. Ad esempio: – String get. Name() restituisce il nome del file o directory – String get. Parent() dà il nome della cartella padre – String get. Path() converte il nome astratto in un percorso a stringa – boolean is. Hidden() verifica se si tratta di file nascosto – long last. Modified() restituisce l’istante di ultima modifica – long length() dà la dimensione del file – String[] list() dà l’elenco di file e cartelle contenute nella cartella denotata dal path corrente (con numerose varianti…) – … Programmazione per la Musica - Prof. Luca A. Ludovico 14. Lettura e scrittura di file

La classe File. Reader • File. Reader è pensata per leggere del testo carattere

La classe File. Reader • File. Reader è pensata per leggere del testo carattere per carattere. • Costruttori: File. Reader(File file), File. Reader(String file. Name), … Programmazione per la Musica - Prof. Luca A. Ludovico 14. Lettura e scrittura di file

La classe Buffered. Reader • Un Buffered. Reader legge testo da un flusso di

La classe Buffered. Reader • Un Buffered. Reader legge testo da un flusso di caratteri in ingresso, in modo da rendere efficiente la lettura sequenziale di caratteri e righe • Sarebbe possibile specificare anche la dimensione del buffer, ma quella di default è sufficientemente capiente per la maggior parte delle applicazioni • Tra i principali metodi: int read() legge un singolo carattere, String read. Line() legge una riga di testo e long skip(long n) salta nella lettura un certo numero di caratteri Programmazione per la Musica - Prof. Luca A. Ludovico 14. Lettura e scrittura di file

Lettura di un file riga per riga File file = new File("miofile. txt"); if

Lettura di un file riga per riga File file = new File("miofile. txt"); if (file. is. File()) { try { File. Reader file. Reader = new File. Reader (file) Buffered. Reader buf. Reader = new Buffered. Reader(file. Reader); String line; // lettura del file di testo riga per riga while ((line = buf. Reader. read. Line()) != null) { ; // operazioni su line } buf. Reader. close(); // rilascio delle risorse } catch (IOException e) { } } Programmazione per la Musica - Prof. Luca A. Ludovico 14. Lettura e scrittura di file

ESEMPIO Parse. Lines. java Il software carica da un file in formato TXT diversi

ESEMPIO Parse. Lines. java Il software carica da un file in formato TXT diversi modelli di scala, codificati uno per riga nella forma nome_modello 1/pc, nc; … nome_modello 2/pc, nc; … e dopo averli caricati all’interno di opportune strutture dati li visualizza nella console. Programmazione per la Musica - Prof. Luca A. Ludovico 14. Lettura e scrittura di file

La classe String. Tokenizer • Negli esempi visti in precedenza si è spesso utilizzato

La classe String. Tokenizer • Negli esempi visti in precedenza si è spesso utilizzato il metodo String[] split(String regex), ove regex è un’espressione regolare. • Una valida alternativa è costituita dalla classe String. Tokenizer del package java. util, che fornisce metodi per spezzare una stringa in token. Un token è una sequenza massimale di caratteri che non contiene un delimitatore. – Ad esempio, è possibile leggere una frase in input e considerare lo spazio come delimitatore dei token, in modo da ottenere un array di singole parole. Programmazione per la Musica - Prof. Luca A. Ludovico 14. Lettura e scrittura di file

Costruttori • Un’istanza di String. Tokenizer viene creata indicando: – la stringa da spezzare,

Costruttori • Un’istanza di String. Tokenizer viene creata indicando: – la stringa da spezzare, – l'eventuale insieme di delimitatori (per default " tnrf") – se i delimitatori sono token o no • String. Tokenizer (String str, String delim, boolean return. Delims) Crea un tokenizer per 'str', che usa i caratteri in 'delim', come delimitatori. 'return. Delims' indica se restituire i delimitatori come token oppure scartarli. • String. Tokenizer (String str, String delim) Come sopra, con return. Delims == false • String. Tokenizer (String str) Come sopra, con delim == " tnrf" Programmazione per la Musica - Prof. Luca A. Ludovico 14. Lettura e scrittura di file

Principali metodi • Un’istanza di String. Tokenizer scorre la stringa sequenzialmente dall'inizio alla fine,

Principali metodi • Un’istanza di String. Tokenizer scorre la stringa sequenzialmente dall'inizio alla fine, restituendo i token uno alla volta. I metodi principali sono: • boolean has. More. Tokens() restituisce true se c'e' ancora un token da restituire • String next. Token() restituisce il prossimo token • String next. Token(String delim) restituisce il prossimo token, usando i caratteri di 'delim' come delimitatori • int count. Tokens() restituisce il numero di token che restano da esaminare Programmazione per la Musica - Prof. Luca A. Ludovico 14. Lettura e scrittura di file

ESEMPIO Easy. Score. java Il software interpreta una rappresentazione testuale di una partitura, in

ESEMPIO Easy. Score. java Il software interpreta una rappresentazione testuale di una partitura, in cui ogni riga corrisponde a uno strumento (monodico) e ogni gruppo di caratteri separato da virgole a una pulsazione di valore ritmico predefinito (ad esempio da un ottavo). Le altezze sono scritte in notazione anglosassone (ad es. C 4 rappresenta il Do della quarta ottava, e Eb 5 il Mi bemolle della quinta). Le pause sono contrassegnate come note «degeneri» tramite la lettera R. E’ possibile introdurre spazi per allineare le note dal punto di vista grafico, ma questi devono essere stralciati dal parsing della melodia. Le durate si ricavano dal numero di virgole che separano le stringhe. Ad esempio, l’incipit di Fra’ Martino sarebbe: C 4, D 4, E 4, C 4, E 4, F 4, G 4, , G 4 R, , , , C 4, D 4, E 4, C 4, E 4, F 4, G 4 Si utilizzi la classe String. Tokenizer. Programmazione per la Musica - Prof. Luca A. Ludovico 14. Lettura e scrittura di file

Scrittura di file su disco • Si può scrivere su file usando due modalità:

Scrittura di file su disco • Si può scrivere su file usando due modalità: carattere per carattere e per stringhe, in analogia con le tecniche di lettura da file. • File. Writer scrive singoli caratteri • Buffered. Writer scrive intere stringhe • Il comportamento è molto simile, dato che File. Writer eredita i metodi di scrittura dalla superclasse: java. io. Output. Stream. Writer Programmazione per la Musica - Prof. Luca A. Ludovico 14. Lettura e scrittura di file

Esempio di scrittura con File. Writer import java. io. *; class Scrivi. Pitches {

Esempio di scrittura con File. Writer import java. io. *; class Scrivi. Pitches { public static void main(String args[]) throws IOException { File. Writer w; w = new File. Writer("pitches. txt"); w. write('A'); // carattere per carattere w. write('G'); w. flush(); // scarica su file } } Programmazione per la Musica - Prof. Luca A. Ludovico 14. Lettura e scrittura di file

Esempio di scrittura con Buffered. Writer import java. io. *; class Scrivi. Pitches {

Esempio di scrittura con Buffered. Writer import java. io. *; class Scrivi. Pitches { public static void main(String args[]) throws IOException { File. Writer w; w = new File. Writer("pitches. txt"); Buffered. Writer b; b = new Buffered. Writer (w); b. write("Do Re Min. Fa Sol La"); b. write("Si"); b. flush(); } } Programmazione per la Musica - Prof. Luca A. Ludovico 14. Lettura e scrittura di file

ESERCIZIO Data una struttura dati che contiene un Array. List di note (ciascuna caratterizzata

ESERCIZIO Data una struttura dati che contiene un Array. List di note (ciascuna caratterizzata da nome della nota, ottava, stato di alterazione, durata) si trovi il modo per scrivere queste informazioni separatamente allineandole in colonna: • Prima riga: nomi delle note • Seconda riga: stato di alterazione • Terza riga: ottava • Quarta riga: numeratore • Quinta riga: denominatore Programmazione per la Musica - Prof. Luca A. Ludovico 14. Lettura e scrittura di file