Problema metodo "readUTF" di DataInputStream

di il
4 risposte

Problema metodo "readUTF" di DataInputStream

Ciao a tutti! Come da titolo ho un piccolo problema in un metodo, che ha come compito la lettura di un file .txt ( precedentemente salvato mediante il metodo "writeUTF" ) contenente stringhe.

                DataInputStream inputPL = null;
		final List<String> songs = new ArrayList<>();
		try {
			inputPL = new DataInputStream(new FileInputStream(nomePlaylist));
			String name;
			name = inputPL.readUTF();
			while (name != null) {
				songs.add(name);
				name = inputPL.readUTF(); // L'ECCEZZIONE VIENE GENERATA QUI !
			}
		} catch (IOException e) {  //     L'ECCEZZIONE VIENE CATTURATA QUI !
			this.getExc().delExc(e); 
		} finally {
			this.setSongs(songs);
			try {
				inputPL.close();
			} catch (IOException | NullPointerException e) {
				this.getExc().setExcText(e);
			}
		}
Questo è il metodo, il problema avviene nel pezzo di codice commentato ! Ovvero io leggo una stringa alla volta, fino a quando la stringa che leggo non è "null" che significa che non c'è altro da leggere! E fin qui tutto bene, se non fosse che al posto di uscire dal while mi lancia una "IOException" e mi tocca catturarla e annullarla, cosa non molto elegante, per far si che il programma continui il suo funzionamento dato che nonostante l'eccezzione il metodo ha fatto il suo dovere e il file è stato letto correttamente dall'inizio alla fine! Vorrei sapere se c'è modo di evitare questa inutile eccezzione e risolvere la cosa in un modo un pò più elegante ? Grazie.

4 Risposte

  • Re: Problema metodo "readUTF" di DataInputStream

    SsaLaroLana ha scritto:


    Ciao a tutti! Come da titolo ho un piccolo problema in un metodo, che ha come compito la lettura di un file .txt ( precedentemente salvato mediante il metodo "writeUTF" ) contenente stringhe.

    Questo è il metodo, il problema avviene nel pezzo di codice commentato ! Ovvero io leggo una stringa alla volta, fino a quando la stringa che leggo non è "null" che significa che non c'è altro da leggere!
    Qui ci sono alcune questioni concettuali da vedere prima. Innanzitutto readUTF non restituisce null per indicare end-of-file. Lancia EOFException. Insomma, non è come ad esempio readLine() di BufferedReader.

    Come seconda cosa, dato che readUTF/writeUTF sono molto particolari e scrivono in un formato ben preciso, questo ha anche una conseguenza a livello concettuale: quel file che gestisci non è un file di testo "puro", e non deve quindi essere editato "a mano" con un editor né letto con altre classi standard di I/O.
  • Re: Problema metodo "readUTF" di DataInputStream

    Ciao! Allora...per il fatto che lancia una EOEFException lo avevo capito,ma pensavo si potesse evitare, per quando riguarda i metodi readUTF/writeUTF vengono utilizzati all'interno della stessa classe e il file viene letto e scritto esclusivamente dalla stessa classe e mai letto iscritto da editor di testo esterni!
  • Re: Problema metodo "readUTF" di DataInputStream

    SsaLaroLana ha scritto:


    Ciao! Allora...per il fatto che lancia una EOEFException lo avevo capito,ma pensavo si potesse evitare, per quando riguarda i metodi readUTF/writeUTF vengono utilizzati all'interno della stessa classe e il file viene letto e scritto esclusivamente dalla stessa classe e mai letto iscritto da editor di testo esterni!
    Se vuoi continuare ad usare readUTF, devi per forza catturare EOFException in modo specifico che chiaramente non denota un "errore" ma solo la fine del file. Oltre al catch di IOException che invece denota un errore di I/O.

    Se non ti piace la gestione di EOFException c'è un'altra soluzione, ammesso che puoi farla e ti piace. Ovvero cambiare leggermente il "protocollo" dei dati nel file. Prima di ogni writeUTF scrivi un singolo byte con valore fisso (a tua scelta) che fa da "marcatore" della presenza della stringa successiva.
    Poi prima di leggere con readUTF leggi il byte marcatore con il classico read() che ritorna, nota bene, -1 per end-of-file. Se il byte marcatore lo leggi e poi alla readUTF hai un EOFException allora sì, in questo caso è un errore che denota un file "malformato".
  • Re: Problema metodo "readUTF" di DataInputStream

    Okei perfetto!!! Grazie mille della spiegazione! Penso che creero un catch che cattura EOFException prima di IOException, cosi catturo l'eccezzione di fine lettura e la annullo!
Devi accedere o registrarti per scrivere nel forum
4 risposte