/* * questo programma risolve il problema posto al quarto punto della * esercitazione 7, svolta il 23-24/4/2007 */ import java.io.*; import javax.swing.JOptionPane; public class SoluzioneSequenza { /* il metodo analizzaSequenza esegue operazioni che possono generare IOException. Invece di inserire nel corpo del metodo un costrutto try ... catch ..., si puo' dichiarare che il metodo analizzaSequenza a sua volta puo' generare IOException. Questo viene fatto aggiungendo "throws IOException" dopo l'intestazione del metodo. In questo modo la responsabilita' di raccogliere l'eccezione viene scaricata sul metodo chiamante, in questo caso il metodo main. Quindi il metodo main, quando chiama analizzaSequenza, DEVE includere la chiamata in un blocco try ... catch ... */ public static boolean analizzaSequenza(BufferedReader fileIn, BufferedWriter fileOut) throws IOException { Sequenza seq = new Sequenza(); boolean fineFile=false; boolean continua=true; while(continua) { String riga = fileIn.readLine(); if(riga==null) { continua=false; fineFile=true; } else if(riga.charAt(0)=='=') { continua=false; fineFile=false; } else { double val = Double.parseDouble(riga); seq.aggiungi(val); } } if(seq.getNumValori()>0) { fileOut.write(seq.getNumValori() + " valori"); /* l'oggetto di classe BufferedWriter contiene il metodo newLine(), che scrive sul file la sequenza di caratteri che rappresenta la fine linea */ fileOut.newLine(); fileOut.write("somma = " + seq.getSomma()); fileOut.newLine(); fileOut.write("media = " + seq.getMedia()); fileOut.newLine(); fileOut.write("==="); fileOut.newLine(); } return fineFile; } public static void main(String[] args) { /* il metodo main chiede all'utente il nome del file da analizzare (senza estensione: sara' aggiunta da programma l'estensione .txt) e crea i due oggetti attraverso i quali leggera' il file di input e scrivera' il file con il risultato dell'analisi. Il nome del file di output inizia con lo stesso nome del file di input, completato dalla stringa "Risultato.txt". Viene poi chiamato ripetutamente il metodo static analizzaSequenza. Il metodo analizzaSequenza riceve come parametri i due oggetti per leggere dal file di input e scrivere sul file di output, ed ha il compito di analizzare una sequenza di valori rappresentata nel file di input, scrivendo sul file di output il risultato della analisi. La sequenza termina con una riga che inizia con il carattere '='. Il metodo analizzaSequenza restituisce true se durante la lettura dei valori viene raggiunta la fine del file di input. Quando viene raggiunta la fine del file di input si chiude il file di output. */ String nomeFile=JOptionPane.showInputDialog("Il file di input deve avere estensione \".txt\"\n"+ "Digitare il nome del file di input senza estensione"); BufferedReader fileLettura; BufferedWriter fileScrittura; try { fileLettura = new BufferedReader(new FileReader(nomeFile+".txt")); } catch (FileNotFoundException e) { System.out.println("Il file "+nomeFile+".txt non esiste o non puo essere aperto"); fileLettura=null; } try { fileScrittura = new BufferedWriter(new FileWriter(nomeFile+"Risultato.txt")); } catch (IOException e) { // questo viene eseguito solo se si verifica una eccezione di classe IOException System.out.println("errore in apertura file "+e); fileScrittura=null; } try { boolean fine; do { fine = analizzaSequenza(fileLettura, fileScrittura); } while(fine==false); } catch (IOException e) { System.out.println("errore in lettura o scrittura file"); } try { fileScrittura.close(); } catch (IOException e) { System.out.println("errore in chiusura file "+e); } System.exit(0); } }