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

Format d'échange (XML, JSON...) Java Discussion :

Lire un fichier JSon avec JavaSE


Sujet :

Format d'échange (XML, JSON...) Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mai 2018
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Mai 2018
    Messages : 3
    Par défaut Lire un fichier JSon avec JavaSE
    Bonjour à tous !

    Je souhaite depuis un certain temps réaliser un projet qui serait entièrement déconnecter, la solution alors trouvé : enregistrer les données au format JSon !

    J'utilise alors la bibliothèque GSon (de Google), qui me permet sans problème de lire et écrire des fichier .json. Malheureusement, après avoir généré le .jar de mon projet, un message d'erreur s'affiche :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    file:\C:\wamp\www\RPG\dist\RPG.jar!\json\Personnage.json (La syntaxe du nom de fichier, de répertoire ou de volume est incorrect).
    Vous pensez sûrement comme moi à la première lecture : "Mais quel idiot, il n'utilise pas le bon chemin d'accès !". Et bien si, lorsque j'utilise une image répertorié dans "C:\wamp\www\RPG\build\classes\img\image.png", le chemin que Java va chercher ressemble à "C:\wamp\www\RPG\dist\RPG.jar!\img\image.png" et mon fichier JSon en question se trouve dans "C:\wamp\www\RPG\build\classes\json\Personnage.json" ! Je ne vois donc pas d'erreur la dessus...

    Place au code !

    J'utilise ce genre de classe pour accéder au fichier :

    Code Java : 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
     
    public class JDAO_Personnage {
     
        private JsonReader reader;
        private static GsonBuilder builder;
        private static Gson gson;
        private Personnage[] lesPersos;
        private String url = getClass().getResource("/json/Personnage.json").getPath();
     
        static{
            builder = new GsonBuilder();
            gson = builder.create();
        }
     
        public List<Personnage> getAllPersonnages() throws FileNotFoundException{
            System.out.println(url);
     
            reader = new JsonReader(new FileReader(url));
            lesPersos = gson.fromJson(reader, Personnage[].class);
     
            List<Personnage> listPersos = new ArrayList<Personnage>();
     
            listPersos.addAll(Arrays.asList(lesPersos));
     
            return listPersos;
        }
    }

    (J'ai copié toute la classe afin que vous puissiez constater les attributs privés, j'espère que cela reste lisible...)

    Comme vous pouvez le voir, j'utilise la méthode getClass().getResource() car on me l'a très "gentiment" conseillé sur StackOverflow (car ce site respire la bienveillance), si vous avez une idée ou besoin d'une précision, N'HÉSITEZ PAS et dites le moi. Je suis désespéré et prêt à me pendre au bout de mon câble ethernet.


    A la revoyure !

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Salut,

    getClass().getResource("/json/Personnage.json") ça permet de retrouver une URL d'une ressource située dans le classpath, typiquement un fichier inclus dans un JAR.

    Il ne faut pas chercher à transformer l'URL en String ou en File, et surtout pas avec getPath(). Il faut utiliser l'URL directement, car une URL ça peut être plein de choses et pas seulement un fichier. D'ailleurs, quand la ressource est dans un JAR, ce n'est plus un fichier. Donc un FileReader, spécialisé pour lire un File ne fonctionnera en aucun cas.

    L'argument du constructeur de JSonReader (de GSon) attends une instance de Reader. Tu as une instance de URL. Il faut donc pouvoir passer de URL à Reader. Pour ce faire, on va passer par une instance de InputStream.

    1. InputStream est permet de lire un flux d'octets
    2. Reader permet de lire un flux de caractères


    Pour transformer un flux d'octets en flux de caractères, on aura besoin de spécifier un encodage. Par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    // transformer un inputStream en Reader, en considérant que l'encodage est de l'UTF-8 :
    Reader reader = new InputStreamReader(inputStream, StandardCharsets.UTF_8);
    Pour obtenir un InputStream à partir d'un URL :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    url = getClass().getResource("/json/Personnage.json");
     inputStream = url.openStream();
    Mais il existe aussi une méthode qui permet d'obtenir directement cet inputStream sans passer par l'URL :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    inputStream  = getClass().getResourceAsStream("/json/Personnage.json")
    Tu peux même utiliser directement JDAO_Personnage.class, plutôt que getClass() (en particulier, dans une méthode static).

    En résumé, pour lire ton .json :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    reader = new JsonReader( new InputStreamReader(JDAO_Personnage.class.getResourceAsStream("/json/Personnage.json"), StandardCharsets.UTF_8) );
    Par ailleurs, quand on ouvre des flux, pour les lire (ou écrire dedans), il faut toujours veiller à les fermer lorsqu'on les a lus, pour libérer des ressources internes éventuelles qui sont utilisées pour ça et qui pourraient occuper de la mémoire inutilement. A force d'accumuler des ressources en mémoire, ton application pourrait même planter à cause d'un manque de mémoire (out of memory error), ou ça pourrait bloquer une autre ressource comme un port TCP/IP, l'accès à un fichier, etc.

    un moyen simple est d'utiliser une structure particulière appelée try-with-resource, qui garantira la fermeture du flux, même en cas d'erreur lors de l'ouverture ou de la lecture :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    try( JsonReader reader = new JsonReader( new InputStreamReader(JDAO_Personnage.class.getResourceAsStream("/json/Personnage.json"), StandardCharsets.UTF_8)) ) {
            lesPersos = gson.fromJson(reader, Personnage[].class);
    }
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mai 2018
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Mai 2018
    Messages : 3
    Par défaut Petite précision
    Bonjour à toi !

    Un GRAND merci pour cette explication, grâce à toi je comprend bien mieux comment la lecture d'un fichier fonctionne ! Ta solution marche parfaitement, seulement j'ai voulu utiliser une technique similaire pour l'écriture de fichier !

    Je ne voudrais pas prendre trop de ton temps, Ô sauveur, donc si tu devais choisir entre le classe
    FileOutputStream
    et la classe
    OutputStreamWriter
    , laquelle conseillerais tu ? (Ou une autre si il y a une meilleure solution !)

    Natty

  4. #4
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    De la même façon, un OutputStreamWriter, parce qu'il permet de choisir l'encodage du fichier. Un FileWriter utilisera l'encodage par défaut.

    Cependant, tu ne pourras de toute manière pas écrire dans un fichier se trouvant dans le jar. Enfin, il y a des solutions, mais c'est compliqué et problématique. Les ressources stockées dans le jar ne sont pas faites pour être modifiées.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

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

Discussions similaires

  1. [Excel] Comment lire des fichiers excel avec php?
    Par dear_rihab dans le forum Bibliothèques et frameworks
    Réponses: 5
    Dernier message: 02/11/2007, 12h38
  2. [C++] Lire un fichier Texte avec SDL
    Par d-jey dans le forum SDL
    Réponses: 8
    Dernier message: 26/05/2006, 02h38
  3. [XML] lire un fichier xml avec php
    Par java_fun dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 31/03/2006, 12h21
  4. Lire les fichiers m4a avec xmms
    Par shinobi dans le forum Applications et environnements graphiques
    Réponses: 2
    Dernier message: 05/12/2005, 11h37
  5. [BCB 5]Comment lire un fichier AVI avec un TAnimate ?
    Par Sitting Bull dans le forum C++Builder
    Réponses: 2
    Dernier message: 15/09/2004, 11h57

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