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 :

[Débutant] Chemins relatifs


Sujet :

Langage Java

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    147
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Septembre 2006
    Messages : 147
    Par défaut [Débutant] Chemins relatifs
    J'ai plusieurs fichiers tiers dans mon projet que j'ai besoin d'utiliser. Je les ai placés dans un dossier "ressources" qui se trouve au même endroit que mes .class et mes .java. Or, il s'avère que dans Java on peut rarement mettre un chemin relatif mais toujours des chemin absolus. Pas très pratique pour la portabilité du programme .

    Donc j'aurais bien aimé savoir une bonne fois pour toute comment faire un chemin relatif qui tienne le coup quand on compile notre jar.
    J'ai trouvé ce post dans la FAQ mais je ne comprend pas ce que c'est sensé faire, du coup, pas facile à débugger quand ça ne marche pas.

    Je n'aimerais pas juste un bout de code a coller mais qu'on m'explique, je déteste ne pas comprendre mon code et on se retrouve toujours dans la m**** après quand on fait comme ça.

    Merci d'avance.

  2. #2
    Expert éminent
    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
    Billets dans le blog
    1
    Par défaut
    Salut,

    Citation Envoyé par Bloodscalp
    J'ai plusieurs fichiers tiers dans mon projet que j'ai besoin d'utiliser. Je les ai placés dans un dossier "ressources" qui se trouve au même endroit que mes .class et mes .java. Or, il s'avère que dans Java on peut rarement mettre un chemin relatif mais toujours des chemin absolus. Pas très pratique pour la portabilité du programme .
    On peut très bien mettre des chemins absolu !!!!

    Citation Envoyé par Bloodscalp
    Donc j'aurais bien aimé savoir une bonne fois pour toute comment faire un chemin relatif qui tienne le coup quand on compile notre jar.
    La principale question est où vont se trouver ces ressources une fois que l'application est distribué en tant que jar ?


    a++

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    147
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Septembre 2006
    Messages : 147
    Par défaut
    Citation Envoyé par adiGuba a écrit :
    On peut très bien mettre des chemins absolu !!!!
    Des chemins relatifs tu veux dire ?

    Je viens de comprendre 2-3 trucs.

    Apparemment, getClass() retourne le chemin ou l'application est exécutée.
    Et getRessource() est obligatoire pour faire comprendre a Java que c'est une ressource extérieure que l'on désire utiliser.

    Donc le code devrait être :
    getClass().getRessource("ressources/maRessources.ext");

    A adapter ensuite si l'on désire un string, un stream, un file ou un URL.

    Cependant ce code ne fonctionne pas. Il me dit à chaque fois que le fichier est introuvable, alors que le chemin est correct.
    C'est sûrement le problème évoqué par afrikha sur ce post.

    Il conseille l'utilisation de getClassloader(). A quoi correspond-elle ? Que fait-elle ? Je n'arrive pas à trouver des infos dessus.

    Mes fichiers sont pris dans la compilation du jar, ils sont donc toujours présents.

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    147
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Septembre 2006
    Messages : 147
    Par défaut
    En réalité, le chemin est un peu différent.

    C:/Documents%20and%20Settings/xojmrc/Eclipse/xmlBuilder/xmlBuilder/ressources/config.ini

    Est-ce que Java comprend les %20 ?

    Si non, comment les enlever et mettre des espaces à la place ?

  5. #5
    Expert éminent
    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
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Bloodscalp
    Des chemins relatifs tu veux dire ?
    Euh... oui

    Citation Envoyé par Bloodscalp
    Apparemment, getClass() retourne le chemin ou l'application est exécutée.
    Non getClass() retourne un objet du type Class représentant le type de l'objet.
    Citation Envoyé par Bloodscalp
    Et getRessource() est obligatoire pour faire comprendre a Java que c'est une ressource extérieure que l'on désire utiliser.
    getResource() permet de charger une resource depuis le CLASSPATH en utilisant le ClassLoader.

    Le ClassLoader est la classe qui gère le chargement des classes et des resources.

    Citation Envoyé par Bloodscalp
    Donc le code devrait être :
    getClass().getRessource("ressources/maRessources.ext");
    Cela dépend de la location exacte de ta resource... mais comme j'ignore toujours la location exacte de ton fichier ce n'est pas évident de t'aider...

    Citation Envoyé par Bloodscalp
    Il conseille l'utilisation de getClassloader(). A quoi correspond-elle ? Que fait-elle ? Je n'arrive pas à trouver des infos dessus.
    getClassLoader() permet d'obtenir le ClassLoader et donc de récupérer des resources dans le CLASSPATH.

    Par exemple la ligne suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    URL url = getClass().getClassLoader().getResource("repertoire/fichier.txt");
    Recherchera dans le CLASSPATH le premier fichier sous l'arborescence "repertoire/fichier.txt".


    Par contre la méthode getResource() de la classe Class fonctionne différemment car elle ajoute automatiquement le package de la classe courante au début du nom de resource...

    a++

  6. #6
    Expert éminent
    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
    Billets dans le blog
    1
    Par défaut
    Nos post se sont croisé ?


    Citation Envoyé par Bloodscalp
    En réalité, le chemin est un peu différent.

    C:/Documents%20and%20Settings/xojmrc/Eclipse/xmlBuilder/xmlBuilder/ressources/config.ini
    Donc le fichier n'est pas présent dans le CLASSPATH mais dans un répertoire quelquonque ?

    Dans ce cas je ne vois pas comment tu pourrais faire pour ne pas utiliser de chemin complet...


    Pour rappel les méthodes getResource() permettent de récupérer des resource dans le CLASSPATH et non pas n'importe où sur le système de fichier...

    a++

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    147
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Septembre 2006
    Messages : 147
    Par défaut
    Citation Envoyé par Bloodscalp
    J'ai plusieurs fichiers tiers dans mon projet que j'ai besoin d'utiliser. Je les ai placés dans un dossier "ressources" qui se trouve au même endroit que mes .class et mes .java.
    Donc non, les fichiers se trouvent bien dans mon classpath (c'est bien la ou y'a tout mes fichier .class et .java ?), dans un répertoire "ressources".

    Le chemin que j'ai noté c'est la valeur de :

    ""+getClass().getResource("ressources/config.ini")

    Je regarde plus en détail ta réponse et je vais voir ce que j'arrive à faire.

    Merci

  8. #8
    Expert éminent
    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
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Bloodscalp
    Donc non, les fichiers se trouvent bien dans mon classpath (c'est bien la ou y'a tout mes fichier .class et .java ?), dans un répertoire "ressources".
    Dans ce cas quel est l'arborescence exacte de ton classpath ????
    Si tu utilises eclipses alors le répertories ressources devraient être vu comme un package...

    a++

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    147
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Septembre 2006
    Messages : 147
    Par défaut


    C'est le fichier config.ini que je dois utiliser.

  10. #10
    Expert éminent
    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
    Billets dans le blog
    1
    Par défaut
    Ok, donc le chemin absolu de ta resource à l'intérieur de ton CLASSPATH est "xmlBuilder/ressources/config.ini", donc pour y accéder tu dois utiliser le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    getClass().getClassLoader().getResource("xmlBuilder/ressources/config.ini");
    Maintenant tu peux également utiliser la méthode getResource() de la classe Class qui permet d'utiliser un chemin relatif par rapport à la classe courante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    getClass().getResource("ressources/config.ini");
    A condition bien sûr que ce soit depuis une classe du package xmlBuilder.


    a++

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    147
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Septembre 2006
    Messages : 147
    Par défaut
    Ok, en fait, ce n'est pas là que se trouvait le vrai problème (mais au moins j'ai bien compris le truc maintenant).

    J'ai ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    FileInputStream infile = new FileInputStream(""+getClass().getClassLoader().getResource("xmlBuilder/ressources/config.ini"));
    FileOutputStream outfile = new FileOutputStream(""+getClass().getClassLoader().getResource("xmlBuilder/ressources/config.ini"));
    J'ai utilisé une méthode en carton pour transformer mon url en string.
    Le problème, c'est que dans l'url, les espaces son transformés en %20, et donc dans mon string aussi, et dans mon file aussi.

    Quand je veut réutiliser le chemin avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    	        Properties.load(infile);
    	        infile.close();
     
    	        Properties.setProperty(strCle, strValeur);
    	        Properties.store(outfile,"header");
    	        outfile.close();
    Il n'arrive pas a trouver le fichier, vu que le chemin contient des %20

    Le message d'erreur :

    Impossible de trouver le fichier de configuration
    java.io.FileNotFoundException: file:\C:\Documents%20and%20Settings\xojmrc\Eclipse\xmlBuilder\xmlBuilder\ressources\config.ini (Syntaxe du nom de fichier, de répertoire ou de volume incorrecte)
    Ma question est donc, comment puis-je faire une conversion, premièrement plus propre (pcq le carton, c'est pas bien) et qui ne me mette pas de %20 à la place des espaces ?

  12. #12
    Expert éminent
    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
    Billets dans le blog
    1
    Par défaut
    Ok : tu n'as pas à utiliser FileInputStream mais la méthode openStream() de l'URL, ou directement getResourceAsStream() qui t'ouvrira un flux correct quel que soit l'emplacement du fichier (dans un jar ou non).

    Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    InputStream infile = getClass().getClassLoader().getResourceAsStream("xmlBuilder/ressources/config.ini");
    try {
        properties.load(infile);
    } finally {
        infile.close();
    }

    Par contre tu ne peux pas modifier un fichier dans le CLASSPATH, puisque lorsqu'il est à l'intérieur du jar principal le fichier ne peut pas être modifié...


    Le mieux dans ce cas est d'utiliser un fichier dans le répertoire courant ou le répertoire HOME de l'utilisateur...


    a++

  13. #13
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    147
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Septembre 2006
    Messages : 147
    Par défaut
    Ah d'accord ^^. Dommage qu'on ne puisse pas changer les fichiers dans le classpath. Nos efforts n'auront tout de même pas été vains, j'ai quand même des fichiers du classpath a ouvrir.

    En tout cas merci beaucoup pour ta patience.

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

Discussions similaires

  1. [Eclipse 3.0][Débutant]Chemin d'accès images
    Par lejimi dans le forum Eclipse Java
    Réponses: 3
    Dernier message: 11/03/2008, 19h04
  2. Réponses: 6
    Dernier message: 12/08/2006, 07h17
  3. [Plugin Tomcat] Chemin relatif
    Par cloogy dans le forum Eclipse Java
    Réponses: 6
    Dernier message: 01/03/2005, 16h26
  4. [XSL-FO] Chemin relatif d'une image
    Par JustAGphy dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 04/08/2004, 13h25
  5. [JSP] Include, problème de chemin relatif
    Par dafly dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 15/04/2004, 14h11

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