Pagina 2 di 2 primaprima 1 2
Visualizzazione dei risultati da 11 a 18 su 18

Discussione: Errore I/O

  1. #11
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802
    Non so cosa sia Zf e one.

    Io lo semplificherei un po' comunque, dando dei nomi decenti alle variabili


    codice:
    BufferedInputStream bis = new BufferedInputStream(Zf.getInputStream(one));
    BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(one.getName()));
    
    byte[] buffer = new byte[4 * 1024];
    int bytesRead;
    
    while ((bytesRead = bis.read(buffer)) != -1) {
        bos.write(buffer, 0, bytesRead);
    }
    
    bos.close();
    bis.close();

    Controllare che la read restituisca qualcosa di strettamente maggiore di zero non è corretto: il valore restituito quando non c'è più nulla da leggere è -1.

    Manca inoltre la gestione delle eccezioni.
    Ultima modifica di Alex'87; 28-07-2014 a 14:47
    SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
    Di questo libro e degli altri (blog personale di recensioni libri) | ​NO M.P. TECNICI

  2. #12
    Quote Originariamente inviata da Alex'87 Visualizza il messaggio
    Non so cosa sia Zf e one.

    Io lo semplificherei un po' comunque, dando dei nomi decenti alle variabili


    codice:
    BufferedInputStream bis = new BufferedInputStream(Zf.getInputStream(one));
    BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(one.getName()));
    
    byte[] buffer = new byte[4 * 1024];
    int bytesRead;
    
    while ((bytesRead = bis.read(buffer)) != -1) {
        bos.write(buffer, 0, bytesRead);
    }
    
    bos.close();
    bis.close();

    Controllare che la read restituisca qualcosa di strettamente maggiore di zero non è corretto: il valore restituito quando non c'è più nulla da leggere è -1.

    Manca inoltre la gestione delle eccezioni.
    Zf è di tipo ZipFile; nel codice per definirlo avevo fatto così:
    codice:
    ZipFile Zf;
            try {Zf = new ZipFile (file);}
            catch (ZipException e) {Zf=null;}
            catch (IOException e1) {Zf=null;};
            System.out.println("Decomprimo il file "+Zf.getName());
    Invece one è la ZipEntry corrispondente al file da estrarre:
    codice:
    ZipEntry one = (ZipEntry) list.nextElement ();
    che nel codice è in un while che la definisce file per file:
    codice:
    while (list.hasMoreElements()) {}
    e
    codice:
    Enumeration list = Zf.entries();
    Per semplificare il codice mi pare tu abbia direttamente eliminato le mie variabili di InputStream e FileOutputStream e le abbia messe direttamente nello scrittore e lettore con buffer...mi abituerò

    Per quanto riguarda le eccezioni:
    codice:
    try {
    BufferedInputStream bis = new BufferedInputStream(Zf.getInputStream(one));
    BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(one.getName()));
    
    byte[] buffer = new byte[4 * 1024];
    int bytesRead;
    
    while ((bytesRead = bis.read(buffer)) != -1) {
        bos.write(buffer, 0, bytesRead);
    }
    
    bos.close();
    bis.close();
    }
    } catch (ZipException e) {System.out.println("Si è verificato un errore. Estrazione fallita");}
    catch (IOException e) {System.out.println("Errore di Input/Output. Estrazione fallita");};
    va bene così?

  3. #13
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802
    codice:
    ZipFile Zf;
    try {Zf = new ZipFile (file);}
    catch (ZipException e) {Zf=null;}
    catch (IOException e1) {Zf=null;};
    System.out.println("Decomprimo il file "+Zf.getName());
    Male.
    In caso di eccezione tu metti Zf a null e vai avanti come se nulla fosse.
    Peccato che poi tu faccia Zf.qualcosa e se Zf è null ottieni NullPointerException.

    In questo caso ha poco senso gestire l'eccezione, poco o nulla puoi fare per rimediare.

    La chiusura degli stream va fatta in finally.
    SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
    Di questo libro e degli altri (blog personale di recensioni libri) | ​NO M.P. TECNICI

  4. #14
    Quote Originariamente inviata da Alex'87 Visualizza il messaggio
    codice:
    ZipFile Zf;
    try {Zf = new ZipFile (file);}
    catch (ZipException e) {Zf=null;}
    catch (IOException e1) {Zf=null;};
    System.out.println("Decomprimo il file "+Zf.getName());
    Male.
    In caso di eccezione tu metti Zf a null e vai avanti come se nulla fosse.
    Peccato che poi tu faccia Zf.qualcosa e se Zf è null ottieni NullPointerException.

    In questo caso ha poco senso gestire l'eccezione, poco o nulla puoi fare per rimediare.

    La chiusura degli stream va fatta in finally.
    L'avevo notato; in effetti nella nuova versione ho messo un Zf di default.
    Messa la chiusura in finally dopo l'ultimo catch.
    Ma ora ho notato che mi hai tolto il flush(). Dopo aver finito, non dovrei anche svuotare il buffer?

  5. #15
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802
    Zf di default? A sua volta non lancia eccezioni? O_o

    (Zf è un altro nome da cambiare: le variabili iniziano sempre con la minuscola)

    flush viene già chiamato da close()
    SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
    Di questo libro e degli altri (blog personale di recensioni libri) | ​NO M.P. TECNICI

  6. #16
    Quote Originariamente inviata da Alex'87 Visualizza il messaggio
    Zf di default? A sua volta non lancia eccezioni? O_o

    (Zf è un altro nome da cambiare: le variabili iniziano sempre con la minuscola)

    flush viene già chiamato da close()
    Per zf (minuscolo a sto punto) di default intendo un file che magari conosco già. Oppure dovrei interrompere lo script, magari con un return qualcosa?

  7. #17
    Utente di HTML.it L'avatar di minomic
    Registrato dal
    Nov 2010
    Messaggi
    635
    Ciao,
    potresti visualizzare un messaggio di errore e poi, dato che sei anche nel main, fare System.exit(-1) per terminare il programma. Questo non fa eseguire il blocco finally però, dato che comunque chiudi il programma, non dovrebbe essere un problema.

  8. #18
    Quote Originariamente inviata da minomic Visualizza il messaggio
    Ciao,
    potresti visualizzare un messaggio di errore e poi, dato che sei anche nel main, fare System.exit(-1) per terminare il programma. Questo non fa eseguire il blocco finally però, dato che comunque chiudi il programma, non dovrebbe essere un problema.
    Il messaggio di errore al posto di un file zip di default intendi?

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.