Visualizzazione dei risultati da 1 a 6 su 6
  1. #1
    Utente di HTML.it
    Registrato dal
    Nov 2015
    residenza
    Fiumicino
    Messaggi
    6

    Scrittura/Lettura vettore di oggetti su un File binario

    Slave a tutti, sto creando un programma che date alcuni credenziali(Titolo, Autore, Editore, Codice Libro) crei una "Libreria digitale" dove si possono archiviare i libri e all'occorrenza cercarli e se si desidera anche eliminarli. il mio problema in questo momento è il seguente, dopo aver ricavato tutti gli elementi da inserire in un oggetto chiamato "Libro"(Che si trova in un vettore di oggetti) che ha come attributi, appunto, Titolo, Autore, Editore e Codice libro vorrei "versare" il vettore di oggetti in un File binario per poi all'occorrenza leggere dal file binario tutto il contenuto e "versarlo" nel vettore di oggetti facendo in modo che io posso utilizzare i metodi di ricerca e eliminazione e aggiunta direttamente sul vettore di oggetti. Posto alcuni Screen della grafica del programma per rendere meglio l'idea.
    1) Schermata Principale:
    Libreria 1.jpg
    2) Aggiungi Libro:
    Libreria 2.jpg
    3) Cerca Libro:
    Libreria 3.jpg

    Vi ringrazio per l'aiuto.

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da LucaRocco Visualizza il messaggio
    vorrei "versare" il vettore di oggetti in un File binario per poi all'occorrenza leggere dal file binario tutto il contenuto e "versarlo" nel vettore di oggetti
    Detto così in questo modo, la prima cosa che viene in mente è .. la serializzazione degli oggetti!
    Vedi ObjectInputStream/ObjectOutputStream. Ci sono comunque dei concetti da sapere e rispettare per poter serializzare oggetti.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Utente di HTML.it
    Registrato dal
    Nov 2015
    residenza
    Fiumicino
    Messaggi
    6
    Quote Originariamente inviata da andbin Visualizza il messaggio
    Detto così in questo modo, la prima cosa che viene in mente è .. la serializzazione degli oggetti!
    Vedi ObjectInputStream/ObjectOutputStream. Ci sono comunque dei concetti da sapere e rispettare per poter serializzare oggetti.
    Si, documentandomi mentre aspettavo una risposta anche io ho notato che l'unica cosa che posso fare è serializzare l'intero array di oggetti. Sto seguendo il mio libro di testo(Vado al 4° superiore) e ho trovato il capitolo relativo alla serializzazione degli oggetti, non mi sembra molto difficile, i concetti li ho tutti ma comunque dei consigli sarebbero ben accetti

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Array/collezioni sono tecnicamente serializzabili ma a patto che lo siano tutti gli oggetti contenuti.
    Le tue classi devono implementare Serializable, il contenuto degli oggetti deve essere serializzabile (se sono primitivi, wrapper dei primitivi, String e altro del framework no problem) e in più la prima super-classe non serializzabile deve avere un costruttore senza argomenti (se è Object, ok).
    Queste sono le regole di base.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    Utente di HTML.it
    Registrato dal
    Nov 2015
    residenza
    Fiumicino
    Messaggi
    6
    Quote Originariamente inviata da andbin Visualizza il messaggio
    Array/collezioni sono tecnicamente serializzabili ma a patto che lo siano tutti gli oggetti contenuti.
    Le tue classi devono implementare Serializable, il contenuto degli oggetti deve essere serializzabile (se sono primitivi, wrapper dei primitivi, String e altro del framework no problem) e in più la prima super-classe non serializzabile deve avere un costruttore senza argomenti (se è Object, ok).
    Queste sono le regole di base.
    Ho visto e ho predisposto tutto per la serializzazione, adesso ho solo un problema con la gestione delle eccezioni. Facendo un metodo del genere
    codice:
    public void Backup() throws java.io.IOException {
                ObjectOutputStream stream = new ObjectOutputStream(new FileOutputStream("Backup.ser"));
                
                stream.writeObject(vet[dim]);
                stream.close();
                
            }
    Come dovrei fare a Invocare il metodo? Il compilatore mi da un errore con l'eccezione. Il metodo si trova nella stessa classe.
    Ultima modifica di LucaRocco; 21-02-2016 a 12:24

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da LucaRocco Visualizza il messaggio
    Come dovrei fare a Invocare il metodo? Il compilatore mi da un errore con l'eccezione. Il metodo si trova nella stessa classe.
    Innanzitutto vedo che stai scrivendo un solo elemento ... non l'intero vettore. Come detto prima, puoi tranquillamente serializzare il vettore per intero, se il contenuto è serializzabile. Tieni presente che la serializzazione, di serie, non funziona in "append": tecnicamente è possibile creare il file, scrivere 1 oggetto, chiudere e poi successivamente riaprirlo in modalità "append" ed aggiungere un altro oggetto. Ma poi la de-serializzazione non funziona più poiché lo stream risulta "corrotto".
    Detto in altro modo: il file lo devi sempre leggere tutto e riscrivere tutto.

    Riguardo alle eccezioni, in Java le eccezioni sono "checked" o "unchecked". Per quelle checked (e IOException è una di queste) vale la regola che si dice "handle or declare". Il compilatore controlla e si assicura che le eccezioni checked non vengano mai ignorate dal programmatore, che deve per forza o gestirle (try-catch) o dichiararle nel metodo per fare in modo che possano uscire ed essere gestite più "a monte".

    Nel tuo Backup() la IOException può uscire fuori ma essendo checked, il chiamante (chi chiama Backup() ) dovrà porsi la stessa questione: o la gestisce o la fa uscire ancora più a monte.

    Un'ultima cosa: il tuo Backup sintatticamente/tecnicamente è ok ma non gestisce correttamente il close. Il close va sempre fatto ma se writeObject fallisce con una eccezione, il close nel tuo caso non viene fatto!
    Quindi una versione più corretta è:

    codice:
    public void backup() throws IOException {
        FileOutputStream fos = new FileOutputStream("Backup.ser");
        ObjectOutputStream oos = null;
    
        try {
            oos = new ObjectOutputStream(fos);
            oos.writeObject(vet);
        } finally {
            try {
                if (oos != null) {
                    oos.close();
                } else {
                    fos.close();
                }
            } catch (IOException e) {
                // Niente di particolare da fare, al massimo un "log".
            }
        }
    }

    Sì .. è più lunga/rognosa ma così considera tutti i path "bad" che possono capitare. Questo vale per qualunque versione di Java. Si può accorciare molto se usi una nuova feature di Java 7 che è il try-with-resource (non so se lo conosci).
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

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.