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

  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 : 56
    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 : 56
    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