IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Java Discussion :

[IO] Enregistrer une classe dans un fichier


Sujet :

Langage Java

  1. #1
    Membre actif
    Inscrit en
    Juin 2002
    Messages
    409
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 409
    Points : 234
    Points
    234
    Par défaut [IO] Enregistrer une classe dans un fichier
    Bonjour,

    J'ai une classe mère qui comporte un gros tas de données.

    Je veux enregistrer tout le contenu dans un fichier. Je crois qu'on emploi là le terme de fichier binaire. Il est donc illisible à l'humain.

    Le but étant de relire ce fichier à postériori pour me retrouver dans le même état qu'au moment du save.

    Le contexte est le suivant ; je développe un gros logiciel de calcul de simulation mécanique des fluides. Les simulations peuvent être très longues (plusieurs jours). Donc je veux enregistrer tous les n pas de temps l'état de mon système pour être capable de le restaurer et reprendre la simulation en cas de plantage.

    Je ne vois pas vraiment comment faire autrement qu'en enregistrant une classe en "brute". Je précise aussi qu'il y a un volume de données à sauver important et variable d'une simu à l'autre. Je ne me vois pas du tout écrire un parser en xml ou en ascii. Je ne suis même pas sûr que ce soit possible.

    Merci d'avance pour votre aide.
    CdlT.

  2. #2
    Membre éprouvé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2010
    Messages
    394
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Avril 2010
    Messages : 394
    Points : 1 212
    Points
    1 212
    Par défaut
    Bonjour,

    Tu devrais peut-être jeter un coup d'oeil sur la serialisation/deserialisation d'objets. Cela pourrait convenir à ton besoin.

    Mako.

  3. #3
    Membre actif
    Inscrit en
    Juin 2002
    Messages
    409
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 409
    Points : 234
    Points
    234
    Par défaut
    Bonjour Mako,
    Merci pour ta réponse.

    J'aimerais éviter la sérialisation pour les raisons suivantes :
    1. Quel format ? XML ? Trop volumineux à cause des balises
    2. J'utilise déjà ce procédé pour les données "Entrantes" de mon soft (avec Jaxb). J'ai vraiment trop galéré pour écrire le schéma XML. Je voudrais m'éviter ça ...


    Il doit bien être possible d'écrire le contenu d'une classe sur le disque. Ca se fait en C/C++ !

  4. #4
    Membre éprouvé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2010
    Messages
    394
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Avril 2010
    Messages : 394
    Points : 1 212
    Points
    1 212
    Par défaut
    Citation Envoyé par kase74 Voir le message
    J'aimerais éviter la sérialisation pour les raisons suivantes :
    1. Quel format ? XML ? Trop volumineux à cause des balises
    2. J'utilise déjà ce procédé pour les données "Entrantes" de mon soft (avec Jaxb). J'ai vraiment trop galéré pour écrire le schéma XML. Je voudrais m'éviter ça ...
    Tu peux faire de la serialisation sans passer par un format XML. Tu peux voir comment faire dans ce tutoriel qui est très bien expliqué. C'est rapide à faire (pas de soucis pour écrire des schémas XML). Par contre, il se peut que tu aies encore des soucis de performance suivant ton objet (à tester).

    Citation Envoyé par kase74 Voir le message
    Il doit bien être possible d'écrire le contenu d'une classe sur le disque. Ca se fait en C/C++ !
    Tu es conscient que ce n'est pas un critère (et encore moins un argument) tout de même...

    Mako

  5. #5
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Points : 48 807
    Points
    48 807
    Par défaut
    Citation Envoyé par kase74 Voir le message

    Il doit bien être possible d'écrire le contenu d'une classe sur le disque.
    Oui, pour autant que la classe s'y prête, et ça s'appelle la sérialisation qu'on viens de te mentionner.

  6. #6
    Membre actif
    Inscrit en
    Juin 2002
    Messages
    409
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 409
    Points : 234
    Points
    234
    Par défaut
    Bonjour,

    Je suis en train de me plonger dans l'excellent livre "Penser en Java" sur le chapitre des IO. Je crois comprendre que ce que je pensais faire n'est pas possible.

    Je viens aussi de prendre conscience que la sérialisation ce n'est pas uniquement vers un format particulier comme le XML.

    Je pense que je vais utiliser un RandomAccessFile et faire des méthodes pour lire et écrire mes données. Il faut encore que je potasses tout ça mais je crois avoir les idées claires. Grâce à vous. Merci.

    Merci encore pour vos réponses.

  7. #7
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 557
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 557
    Points : 21 616
    Points
    21 616
    Par défaut
    Citation Envoyé par kase74 Voir le message
    Je suis en train de me plonger dans l'excellent livre "Penser en Java" sur le chapitre des IO. Je crois comprendre que ce que je pensais faire n'est pas possible.
    ... Si... Enregistrer des données brutes comme on le fait en C/C++ ça se fait avec le mécanisme de sérialisation. (Qui n'est pas trop à la mode je te l'accorde, mais ça vaut toujours mieux que l'écrire toi-même.)

    Citation Envoyé par kase74 Voir le message
    Je viens aussi de prendre conscience que la sérialisation ce n'est pas uniquement vers un format particulier comme le XML.
    La sérialisation se fait toujours vers un format particulier, mais pas forcément un truc comme XML. En l’occurrence on te parle du mécanisme de sérialisation interne à Java. Mais en fait il faudrait lire les liens qu'on te donne.

    Citation Envoyé par kase74 Voir le message
    Je pense que je vais utiliser un RandomAccessFile et faire des méthodes pour lire et écrire mes données.
    Comme tu veux...
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  8. #8
    Membre chevronné
    Avatar de professeur shadoko
    Homme Profil pro
    retraité nostalgique Java SE
    Inscrit en
    Juillet 2006
    Messages
    1 257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : retraité nostalgique Java SE

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 257
    Points : 1 855
    Points
    1 855
    Par défaut
    dans un contexte différent (la finance) j'ai fait dans le "rustique": un fichier de log texte qui enregistrait régulièrement des évenements dans un format très facile à re-analyser. ça donnait de très gros fichiers journaux mais c'était super simple pour reprendre des historiques d'incidents (nombreux )
    J'ai des principes: je peux toujours trouver une bonne raison pour les contredire .... mais j'ai des principes!
    (mon excellent bouquin sur Java : https://eska-publishing.com/fr/livre...822407076.html)

  9. #9
    Membre actif
    Inscrit en
    Juin 2002
    Messages
    409
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 409
    Points : 234
    Points
    234
    Par défaut
    Bonjour,

    Après une étude plus avancée du fameux livre, je constate qu'effectivement la sérialisation (voir chap 11) répond tout à fait à ce que je cherche. Je trouve que c'est même hyper puissant et souple.

    L'ignorance m'a fait réagir un peu trop tôt vis à vis de la réponse de Mako. Méa culpa .

    Je vais donc implémenter cette solution.

    Merci à tous pour vos réponses et pour votre indulgence.

  10. #10
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,

    Citation Envoyé par kase74 Voir le message
    Quel format ? XML ? Trop volumineux à cause des balises
    Le format XML n'est pas forcément beaucoup plus volumineux. Surtout que l'API XMLEncoder évite d'enregistrer les données par défaut.

    De plus le XML a l'avantage d'être bien compressible. Il suffit d'ajouter un GZIPOutputStream dans la chaine


    a++

  11. #11
    Membre à l'essai
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mars 2012
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2012
    Messages : 8
    Points : 13
    Points
    13
    Par défaut just JAVA
    tu met dans ta class implements Serializable(attention il y a des types qu il ne peux être serializable alors tu fait attention)
    puis pour sauvegardé ta class je te suggère de le faire dans une autre classe
    exemple de code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
       ClassAsauvegarde obj=new ClassAsauvegarde();
       File f=new File("chemin");
       ObjectOutputStream oos=new ObjectOutputStream(new FileOutputStream(f));
    	oos.writeObject(obj);
    	oos.close();
    bon chance.

  12. #12
    Membre actif
    Inscrit en
    Juin 2002
    Messages
    409
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 409
    Points : 234
    Points
    234
    Par défaut
    Je reviens donner des nouvelles. Après un long moment c'est vrai. Désolé. Mais les obligations et les priorités du chef, qui sont d'ailleurs impénétrables, m'ont lancé sur un autre sujet ...

    J'ai donc bien implémenté le mécanisme de sérialisation. C'est top ! Hyper simple à mettre en oeuvre. Même dans mon cas où j'ai vraiment un gros tas de données avec des liaisons entres objets dans tous les sens.

    Seul hic (dans mon cas) c'est le volume des fichiers engendrés. J'ai donc changé de stratégie : je ne sauve plus l'ensemble de mes objets tous les n pas de temps. J'ai fais plus subtil et au final le résultat est acceptable vis à vis du volume des données traitées.

    Je recommande vivement de s'intéresser à cette sérialisation. Même pour des objets simples. Cela facilite tellement la vie ... J'avais bien implémenté une classe dédiée pour gérer cela comme le conseil Elkorchi . C'est effectivement une bonne pratique je trouve.

    Encore merci à tous pour vos lumières.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Enregistrer une classe dans un fichier
    Par Davjack dans le forum Langage
    Réponses: 2
    Dernier message: 31/05/2007, 21h16
  2. Réponses: 3
    Dernier message: 13/02/2007, 17h54
  3. Sauvegarder/Lire une classe dans un fichier
    Par Rodrigue dans le forum C++
    Réponses: 10
    Dernier message: 10/09/2005, 14h12
  4. Réponses: 4
    Dernier message: 10/02/2005, 16h10
  5. [C#] [.NET] Lecture d'une classe dans un fichier
    Par niPrM dans le forum Windows Forms
    Réponses: 4
    Dernier message: 18/05/2004, 08h57

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo