Questa esercitazione verte principalmente
su i/o su file di testo e binari.
Come sempre, prima della fine dell'esercitazione siete invitati a
inviare tutti i file .java
prodotti (anche se incompleti) al docente come attachment di un
unico messaggio di posta elettronica con Subject: LIP-07 Es20 (ad esempio usando
pine, seguendo le corrispondenti istruzioni).
Indirizzi di posta
elettronica da
utilizzare per inviare programmi svolti in aula o a casa dopo le
esercitazioni.
CORSO A | CORSO B |
lipa-doc oppure lipa-doc@cli.di.unipi.it
|
lipb-doc oppure lipb-doc@cli.di.unipi.it
|
Esercizi
Si suggerisce di creare un nuovo progetto Eclipse per i file di questa esercitazione,
chiamandolo ad esempio LIP-ES-20. Se
hai problemi con Eclipse, prova a
guardare la breve introduzione all'uso di eclipse o segui le istruzioni riassuntive sui
primi passi con Eclipse.
Per gli esercizi che coinvolgono array, usare i metodi
della classe ArrayUtils.java quando opportuno.
Per leggere dei dati in
input da tastiera, usare la classe Input.java. Ricordarsi di
importare entrambe le classi nel package.
|
- [108]
Sfruttando le classi FileReader e FileWriter (senza usare I/O
bufferizzato!), scrivere un programma Comprimi il cui metodo
main legge il nome di un file da tastiera, lo apre in
lettura e ne scrive il contenuto sul file output.txt
scartando tutti i caratteri non alfabetici (cioè diversi da a-z
A-Z).
Se si verifica un'eccezione bisogna chiedere un nuovo
nome di file e ripetere l'operazione (si termina solo quando un file
viene elaborato correttamente per intero).
Nota: per testare il programma potete usare il file
testo.txt.
Cosa succede se passate il nome di un file che non
esiste? E se invece è il file output.txt che
non esiste? E se invece non avete il diritto di scrittura sul file
output.txt? (Potete usare il comando ls -l da linea di comando per
vedere i diritti di accesso ai file, il comando chmod a-rw nomefile per revocare i
diritti su un certo file, ed il comando chmod a+rw nomefile per
ripristinarli).
- [109a]
Scrivere la classe IOArrayList che estende la classe
java.util.ArrayList<String>
con i metodi:
- public void load(String
fileName)
- public void
save(String fileName)
Il metodo load deve inserire
alla fine del vettore tutte le linee del file di nome fileName. Se il file non esiste il
metodo deve lanciare una IllegalArgumentException. Tutte le
altre eccezioni di input/output devono essere delegate al chiamante.
Il metodo save invece deve
scrivere nel file fileName
tutti gli elementi del vettore, uno per riga. Eventuali eccezioni di
input/output devono essere delegate al chiamante.
- [109b] Scrivere la classe TestIOArrayList che legge
ripetutamente un intero n e
stampa tutte le righe di lunghezza minore o uguale a n del file text.txt
sul file text_n.txt, sfruttando
opportunamente un oggetto di tipo IOArrayList.
Il programma termina quando il valore n immesso è minore o uguale
a zero.
Opzionale: Eventuali eccezioni di i/o devono essere catturate e
gestite stampando un messaggio che invita l'utente a verificare che
l'accesso al file system funzioni normalmente, ma non devono causare
la terminazione anomala del programma.
- [110] Il programma
SommaInteri.java,
chiede all'utente il nome di un file, e assumendo che
il file contenga una sequenza di interi, uno per linea,
ne stampa la somma (si provi il programma con il file integers.txt). Il programma fa una ragionevole gestione delle eccezioni.
-
Modificare il programma SommaInteri chiamandolo SommaInteriSafe in modo che quando si
verifica un'eccezione venga comunque stampata la somma calcolata fino
a quel momento.
-
Modificare il programma SommaInteri chiamandolo SommaInteriRobust in modo che
quando si verifica un'eccezione di tipo NumberFormatException dovuta ad
una linea del file non convertibile in intero si scarti tale riga ma
si prosegua con il calcolo della somma.
- [111a] Il file studenti.txt contiene, su ciascuna
riga, le informazioni relative a uno degli studenti iscritti a un
certo corso. Tali informazioni comprendono nell'ordine: il cognome, il
nome, l'account e il voto verbalizzato allo studente. I campi sono
separati dal carattere ":". Si noti che il voto
potrebbe essere assente.
Sfruttando la classe Studente già
predisposta per rappresentare le informazioni rilevanti degli
studenti, si vuole scrivere un programma GestioneVoti che inizializzi un
vettore di studenti con i dati contenuti nel file studenti.txt e poi offra un menu per:
- assegnare il voto a uno studente (chidendo account e voto e verificando che lo studente non abbia già verbalizzato);
- stampare su schermo la lista degli studenti che hanno già verbalizzato;
- stampare su schermo la lista degli studenti che devono ancora verbalizzare;
- stampare le statistiche sul corso (studenti iscritti, studenti che hanno superato l'esame, voto medio verbalizzato);
- salvare la lista sul file studenti.txt (in modo testuale) e uscire.
Nota: sfruttare il metodo split() della classe String per separare i campi che
compongono ciascuna riga del file studenti.txt. Gestire le eccezioni come ritenuto più opportuno.
- [111b] Il salvataggio in formato testuale
permette di editare le informazioni prima del riavvio
dell'applicazione. Questo può essere conveniente ma può
anche introdurre errori accidentali.
Modificare le classi Studente e GestioneVoti lasciando
l'opportunità di esportare i dati in formato testuale sul file
studenti.txt ma facendo in modo
che il caricamento e il salvataggio dei dati avvengano sul file
binario studenti.bin.
Nota: sfruttare il meccanismo della serializzazione.
- [112] Scrivere un programma CatFiles contenente il metodo
statico
public static void concat(String[] inFiles, String outFile)
che concatena il contenuto di tutti i files i cui nomi sono contenuti
nell'array inFiles salvando
il risultato sul file il cui nome è indicato da outFile.
Se una delle stringhe dell'array inFiles non corrisponde ad un file
accedibile, la stringa viene ignorata e si passa alla prossima.
Eventuali altre eccezioni di I/O devono essere catturate dal metodo,
che in questo caso deve lanciare una IllegalArgumentException.
Per testare il programma, scrivere una semplice classe TestCatFiles
che nel main invoca il
metodo in questione dopo aver chiesto i nomi dei file
all'utente.
Controllare che l'effetto sia quello desiderato.
|