Visualizzazione dei risultati da 1 a 9 su 9
  1. #1

    Scrittura Oggetti su File

    ciao a tutti,
    Vorrei un chiarimento, utilizzo il metodo writeObject() della classe FileObjectStream per scrivere un oggetto su file, il problema e' che dopo aver scritto un oggetto, se in seguito ne scrivo un altro mi cancella il precedente perchè mi ricrea nuovamente il file! c'è un modo per aggiungere oggetti ad un file preesistente? una sorta di append() delle stringhe...

  2. #2
    Utente di HTML.it
    Registrato dal
    Apr 2011
    Messaggi
    16
    Si è possibile. Se leggi il javadoc per FileOutputStream troverai che uno dei constructors ti da lo possibilità di inserire una valore boolean per specificare se lo devi "appendere" o not.
    http://download.oracle.com/javase/1....putStream.html

  3. #3
    cavolo, grazie mille ...
    bastava leggere il secondo costruttore... io cercavo proprio un'altra classe tipo ObjectAppendStream
    che però non esiste

  4. #4
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328
    Originariamente inviato da scozzese
    Si è possibile. Se leggi il javadoc per FileOutputStream troverai che uno dei constructors ti da lo possibilità di inserire una valore boolean per specificare se lo devi "appendere" o not.
    http://download.oracle.com/javase/1....putStream.html
    L'append non è fattibile se si usa la serializzazione (ObjectOutputStream e ObjectInputStream). Questo perchè la creazione dell'ObjectOutputStream scrive nel file un header, che viene successivamente letto dall'ObjectInputStream.

    Aprire in append con ObjectOutputStream un file precedentemente creato con lo stesso oggetto, risulta nell'aggiunta, alla fine del file, di un secondo header con la conseguente corruzione del file. In lettura verrà sollevata una StreamCorruptedException.

    Per poter effettuare un'append su un file di oggetti serializzati è necessario leggere l'intero file esistente e ricrearlo da zero nello stesso ordine.

    Si vedano questi documenti:
    http://java.sun.com/javase/technolog...ndSerialStream
    http://codify.flansite.com/2009/11/j...existing-file/


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  5. #5
    scusami non ti seguo, per effettuare un append su un file esistente non credo ci sia bisogno di leggere il file e ricrearlo, se il file esiste, lo si apre con il boolean true (ovvero in append) altrimenti lo si apre in scrittura... il problema è nel leggerlo perchè se scriviamo degli oggetti diversi dovremmo fare un seek di n oggetti prima di leggere quello che ci interessa... ma probabilmente mi sfugge qualcosa

  6. #6
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328
    Originariamente inviato da Davdx
    scusami non ti seguo, per effettuare un append su un file esistente non credo ci sia bisogno di leggere il file e ricrearlo, se il file esiste, lo si apre con il boolean true (ovvero in append) altrimenti lo si apre in scrittura... il problema è nel leggerlo perchè se scriviamo degli oggetti diversi dovremmo fare un seek di n oggetti prima di leggere quello che ci interessa... ma probabilmente mi sfugge qualcosa
    Ti sfugge quello che ho detto, che evidentemente non l'ho detto bene:

    La creazione dell'ObjectOutputStream scrive nel file un header
    e
    Aprire in append con ObjectOutputStream un file precedentemente creato con lo stesso oggetto, risulta nell'aggiunta, alla fine del file, di un secondo header
    Quindi, nel momento in cui creo un file pippo contenente degli oggetti serializzati, ottengo questo:

    codice:
    header_creato_da_ObjectOutputStream
    Oggetto1
    Oggetto2
    ...
    OggettoN
    Se lo riapro in scrittura (ObjectOutputStream) in append, e ci scrivo altri due oggetto, ottengo questo:

    codice:
    header_creato_da_ObjectOutputStream
    Oggetto1
    Oggetto2
    ...
    OggettoN
    header_creato_da_ObjectOutputStream
    OggettoN+1
    OggettoN+2
    Il file è corrotto (c'è un secondo header, che non dovrebbe esserci!).

    Per questo, se si stanno usando dei file contenenti oggetti serializzati, non si può usare l'append. Si deve aprire il file in lettura, deserializzare tutti gli oggetti, chiudere il file, ricrearlo (senza append), riscrivere tutti gli oggetti precedentemente letti e poi aggiungere quelli nuovi.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  7. #7
    ah ok, ora è tutto molto più chiaro grazie mille...
    ma per curiosità, che scopo ha l'header di ObjectOutputStream?
    ObjectOutputStream non avrebbe potuto scrivere semplicemente gli oggetti senza farsi il figo e ribadire ogni volta che è stato chiamato lui per scriverli?

  8. #8
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328
    Originariamente inviato da Davdx
    ah ok, ora è tutto molto più chiaro grazie mille...
    ma per curiosità, che scopo ha l'header di ObjectOutputStream?
    ObjectOutputStream non avrebbe potuto scrivere semplicemente gli oggetti senza farsi il figo e ribadire ogni volta che è stato chiamato lui per scriverli?
    No, l'header ha uno scopo ben preciso ed è ben documentato (anche nei link che ho postato sopra).
    La serializzazione degli oggetti è un procedimento particolare che deve funzionare anche attraverso canali differenti (sono molto comuni le socket): scrivere un oggetto dentro ad una socket equivale ad inviare i dati dell'oggetto da una parte all'altra di una comunicazione di rete.

    Per quanto concerne le astrazioni, scrivere su un file e scrivere su una Socket non fa alcuna differenza a livello di codice (l'ObjectOutputStream può essere costruito su un OutputStream qualunque, sia esso un file o una socket, appunto), ma ne ha parecchia a livello pratico: un file può essere chiuso e riaperto quante volte si vuole, ma lo stesso non vale per una Socket. Ecco che alcune cose sono permesse, altre no, perchè non valide a priori per tutti i canali di output sottostanti.

    Queste e altre cose sono ben documentate in questa pagina.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  9. #9
    grazie per i link e le spiegazioni, purtroppo ancora non ho studiato socket e varie connessioni, quindi non immaginavo che in quel contesto l'header sarebbe stato utile

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.