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

Java Discussion :

Sauvegarder les paramètres d'une classe


Sujet :

Java

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 152
    Points : 64
    Points
    64
    Par défaut Sauvegarder les paramètres d'une classe
    Bonjour,

    Je voulais savoir s'il existait un moyen de sauvegarder les paramètres d'une classe dans un fichier txt ou autre. Je peux le faire en écrivant manuellement ces paramètres dans un fichier mais s'il y a une méthode plus efficace qui existe je suis preneur!

    Merci d'avance.

  2. #2
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 547
    Points : 21 602
    Points
    21 602
    Par défaut
    Hello,

    Par exemple, gson ou jackson, qui les stocke en JSON ?
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 152
    Points : 64
    Points
    64
    Par défaut
    Hmm je ne suis pas familier avec ça, en fait c'est plus pour stocker les valeurs des paramètres pour les réutiliser plus tard.
    Par exemple une classe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    class Exemple{
    public int X,Y;
    }
    Il faudrait que je puisse sauvegarder X et Y qq part pour pouvoir les utiliser si je veux recréer un objet de type Exemple.

  4. #4
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 547
    Points : 21 602
    Points
    21 602
    Par défaut
    Oui oui, donc gson ou jackson par exemple.

    On a même un tutoriel pour gson.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 152
    Points : 64
    Points
    64
    Par défaut
    Ok merci, je vais étudier ça!

  6. #6
    Membre régulier Avatar de scorbo
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    176
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Décembre 2002
    Messages : 176
    Points : 83
    Points
    83
    Par défaut
    Il existe également le format Yaml qui permet d'enregistrer l'état d'un objet et de le recréer.

    http://jyaml.sourceforge.net/
    https://code.google.com/p/snakeyaml/

  7. #7
    Modérateur
    Avatar de wax78
    Homme Profil pro
    Chef programmeur
    Inscrit en
    Août 2006
    Messages
    4 072
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chef programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 4 072
    Points : 7 974
    Points
    7 974
    Par défaut
    Sinon y'a XStream aussi qui peut convenir.
    (Les "ça ne marche pas", même écrits sans faute(s), vous porteront discrédit ad vitam æternam et malheur pendant 7 ans)

    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  8. #8
    Membre chevronné
    Avatar de eulbobo
    Homme Profil pro
    Développeur Java
    Inscrit en
    Novembre 2003
    Messages
    786
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Novembre 2003
    Messages : 786
    Points : 1 993
    Points
    1 993
    Par défaut
    Sinon, tu peux aussi avoir recours à la sérialisation d'objets.

    http://java.developpez.com/faq/java/..._serialisation

    Personnellement, je trouve ça très efficace, et si tu utilises les fonctions NIO2 de Java7 pour lire et écrire, c'est simple, propre et efficace
    Je ne suis pas mort, j'ai du travail !

  9. #9
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 547
    Points : 21 602
    Points
    21 602
    Par défaut
    La sérialisation native c'est pas si simple que ça quand on commence à vouloir changer de version.

    Genre dans ta classe tu ajoutes une nouvelle propriété importante, et *bam* les précédentes sauvegardes deviennent inutilisables.
    Par contre c'est plutôt simple et vite fait.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  10. #10
    Modérateur
    Avatar de wax78
    Homme Profil pro
    Chef programmeur
    Inscrit en
    Août 2006
    Messages
    4 072
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chef programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 4 072
    Points : 7 974
    Points
    7 974
    Par défaut
    Oui mais il ne faut pas que les objets soient modifié d'une version d'un programme a l'autre. Cela dit ca reste valable pour les autres méthodes aussi dans certains cas, mais beaucoup moins.
    (Les "ça ne marche pas", même écrits sans faute(s), vous porteront discrédit ad vitam æternam et malheur pendant 7 ans)

    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  11. #11
    Membre chevronné
    Avatar de eulbobo
    Homme Profil pro
    Développeur Java
    Inscrit en
    Novembre 2003
    Messages
    786
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Novembre 2003
    Messages : 786
    Points : 1 993
    Points
    1 993
    Par défaut
    Citation Envoyé par thelvin Voir le message
    La sérialisation native c'est pas si simple que ça quand on commence à vouloir changer de version.

    Genre dans ta classe tu ajoutes une nouvelle propriété importante, et *bam* les précédentes sauvegardes deviennent inutilisables.
    Par contre c'est plutôt simple et vite fait.
    Les problèmes apparaissent quand tu supprimes des attributs de ta classe, pas quand tu en ajoutes (auquel cas ils sont initialisés avec la valeur par défaut, donc null pour des objets).
    Et c'est pour ça qu'on utilise le serial version UID pour savoir si un objet sérialisé avec une classe est compatible avec une autre version améliorée (mais si on met 1L à chaque fois, forcement, y'a des problèmes)


    L'avantage c'est qu'il n'y a pas besoin de charger de librairies externes et que les données à sauvegarder dans le cas présent ont l'air suffisamment simples aussi.
    Je ne suis pas mort, j'ai du travail !

  12. #12
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 547
    Points : 21 602
    Points
    21 602
    Par défaut
    Citation Envoyé par eulbobo Voir le message
    Les problèmes apparaissent quand tu supprimes des attributs de ta classe, pas quand tu en ajoutes (auquel cas ils sont initialisés avec la valeur par défaut, donc null pour des objets).
    Oui ben c'est pas mal déjà.

    Citation Envoyé par eulbobo Voir le message
    Et c'est pour ça qu'on utilise le serial version UID pour savoir si un objet sérialisé avec une classe est compatible avec une autre version améliorée (mais si on met 1L à chaque fois, forcement, y'a des problèmes)
    Pas spécialement. Ça t'informe au moment où tu essaies que la désérialisation va pas marcher ou donner n'importe quoi, la belle affaire. Tu l'aurais su en essayant de toute façon. C'est vrai que ça évite certaines attaques de sécurité, mais à part ça bof.

    Mais sinon oui, c'est plus simple que le reste.
    À noter aussi quand même, que pouvoir ouvrir la sauvegarde dans Notepad++ c'est souvent appréciable, et que la sérialisation native ne le permet pas.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  13. #13
    Membre chevronné
    Avatar de eulbobo
    Homme Profil pro
    Développeur Java
    Inscrit en
    Novembre 2003
    Messages
    786
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Novembre 2003
    Messages : 786
    Points : 1 993
    Points
    1 993
    Par défaut
    Au cas où ça intéresse quelqu'un, petit bout de code pour lire/sauvegarder un objet sur le disque avec Java 7 à adapter selon vos besoins.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
     
    	public static void saveObject(Object obj, String fileName)
    			throws IOException {
    		Path file = Paths.get(fileName);
    		Files.deleteIfExists(file);
    		Files.createFile(file);
     
    		try (FileOutputStream fos = new FileOutputStream(file.toFile());
    				ObjectOutputStream oos = new ObjectOutputStream(fos);) {
    			oos.writeObject(obj);
    			oos.flush();
    		} catch (IOException c) {
    			System.out.println(c.getMessage());
    			throw c;
    		}
    	}
     
    	public static Object readObject(Path file) throws ClassNotFoundException, ClassCastException, IOException{
    		return readObject(file, Object.class.getClass());
    	}
     
    	public static <T> T readObject(Path file, Class<T> clazz) throws IOException, ClassNotFoundException, ClassCastException{
    		T returnObj = null;
    		try (FileInputStream fis = new FileInputStream(file.toFile());
    				ObjectInputStream ois = new ObjectInputStream(fis);) {
    			returnObj = (T) ois.readObject();
    		} catch (Exception c) {
    			System.out.println(c.getMessage());
    			displaySuppressed(c.getSuppressed());
    			throw c;
    		}
     
    		return returnObj;
    	}
     
    	private static void displaySuppressed(Throwable... t){
    		for (Throwable thr : t){
    			System.out.println("suppressed : " + thr.getMessage());
    		}
    	}
    Je ne suis pas mort, j'ai du travail !

  14. #14
    Modérateur
    Avatar de kolodz
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2008
    Messages
    2 211
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 211
    Points : 8 316
    Points
    8 316
    Billets dans le blog
    52
    Par défaut
    Bonjour,

    Je me permet de faire un rappel sur l'utilisation des fichiers *.properties

    http://docs.oracle.com/javase/7/docs...roperties.html

    Cela permet d'avoir une association clé/valeur.

    Citation Envoyé par settings.properties
    #Mon Apr 27 18:12:50 CEST 2015
    key=myValue
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    import java.io.IOException;
    import java.net.URISyntaxException;
    import java.util.Properties;
     
    public class Prop {
    	static final String key = "key";
    	public static void main(String[] args) throws IOException, URISyntaxException, InterruptedException {
     
    		// Lire un fichier de propriétés se trouvant dans le fichier jar de l'application
    		Properties props = new Properties();
    		props.load(ClassLoader.getSystemResourceAsStream("settings.properties"));
    		System.out.println("Value form file : "+props.getProperty(key));
     
    	}
    }
    A noté qu'un fois l'objet Properties est chargé, celui-ci ne prend pas en compte les modifications réalisées dans le fichier (sauf si tu le recharge manuellement).
    Il est possible de demander la sauvegarde de l'objet en fichier :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    // Ecriture dynamique
    		ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
    		URL url = classLoader.getResource("settings.properties");
    		props.put(key, "value");
    		props.store(new FileOutputStream(new File(url.toURI())), null);
    L'objet Properties est généralement utilisé pour paramétré une application, avant son lancement.

    Cordialement,
    Patrick Kolodziejczyk.
    Si une réponse vous a été utile pensez à
    Si vous avez eu la réponse à votre question, marquez votre discussion
    Pensez aux FAQs et aux tutoriels et cours.

Discussions similaires

  1. [Débutant] Récupérer les paramètres d'une routine
    Par nifty dans le forum Assembleur
    Réponses: 5
    Dernier message: 18/04/2005, 15h35
  2. [VB.NET] Parcourir les attributs d'une classe
    Par pasqwal dans le forum Windows Forms
    Réponses: 3
    Dernier message: 15/02/2005, 10h47
  3. Réponses: 4
    Dernier message: 10/02/2005, 17h10
  4. Réponses: 7
    Dernier message: 08/01/2005, 14h24
  5. [VB6]Enumérer les attributs et les méthodes d'une classe
    Par HPJ dans le forum VB 6 et antérieur
    Réponses: 7
    Dernier message: 04/05/2004, 19h34

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