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

Entrée/Sortie Java Discussion :

Charger fichier à partir de JAR en static


Sujet :

Entrée/Sortie Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Par défaut Charger fichier à partir de JAR en static
    Salut,

    D'habitude, pour charger un fichier à partir d'un jar, je fais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    getClass().getResource(filename)
    Le problème, c'est que si on veut charger le fichier dans une méthode static, et bien le getClass(), ça n'existe pas...

    Je me suis donc dit, je vais faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MaClass.class.getResource(filename)
    Là le problème, c'est que si MaClass est dans le package monpackage, et bien le chemin de filename est relatif au package et non à l'application...
    Il faut donc mettre les images dans le répertoire monpackage...

    Mais bon, en général, les images, ça se met dans un répertoire img, à la racine, et c'est comme ça qu'on fait avec getClass().getResource(...)...

    Avez-vous une solution?

    EDIT: La solution, c'est juste que j'avais oublié le '/' devant le chemin du fichier (/img/image.png)...
    EDIT 2: Autre solution, qui me paraît plus propre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ClassLoader.getSystemResource("img/image.png"); //donc sans le '/'

  2. #2
    Membre Expert
    Avatar de afrikha
    Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    1 600
    Détails du profil
    Informations personnelles :
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2005
    Messages : 1 600
    Par défaut
    Je ne suis pas sùr du tout et je n'ai jamais testé mais essaye quand mème:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    MaClass.class.getClassLoader().getRessource(filename);


    Mes publications
    Lisez
    Les régles du forum
    Pensez au bouton

  3. #3
    Membre Expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Par défaut
    Citation Envoyé par afrikha
    Je ne suis pas sùr du tout et je n'ai jamais testé mais essaye quand mème:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    MaClass.class.getClassLoader().getRessource(filename);
    Non les images ne sont pas chargées

  4. #4
    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 ®om
    Là le problème, c'est que si MaClass est dans le package monpackage, et bien le chemin de filename est relatif au package et non à l'application...
    Je ne comprend pas, le mécanisme est le même que tu utilises getClass() dans MaClass ou MaClass.class...
    • Si le nom de la resource commence par un '/', alors elle sera recherché à partir de la "base" du classpath (exemple : "/img/images.png").
    • Sinon, le chemin du package courant est rajouté avant le nom de la resource. Ainsi si la classe appartient au package com.monsite, la resource "img/image.png" sera équivalent à "/com/monsite/img/image.png"...
    a++

  5. #5
    Membre Expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Par défaut
    Citation Envoyé par adiGuba
    Salut,


    Je ne comprend pas, le mécanisme est le même que tu utilises getClass() dans MaClass ou MaClass.class...
    • Si le nom de la resource commence par un '/', alors elle sera recherché à partir de la "base" du classpath (exemple : "/img/images.png").
    • Sinon, le chemin du package courant est rajouté avant le nom de la resource. Ainsi si la classe appartient au package com.monsite, la resource "img/image.png" sera équivalent à "/com/monsite/img/image.png"...
    a++
    Bon, ok, j'avais oublié le '/', honte à moi (et d'ailleurs ça ne marche qu'avec / pas avec File.separator (\).

    Donc Résolu...


    Par contre, je ne comprends pas très bien ce que signifie MaClass.class....
    Vu la syntaxe, on pourrait penser que class est un attribut, mais il n'en est rien - c un mot clé -.
    Et quelle est la différence avec getClass() quand on est dans une instance?

  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
    Citation Envoyé par ®om
    (et d'ailleurs ça ne marche qu'avec / pas avec File.separator (\).
    Normal il s'agit d'un chemin logique à l'intérieur du classpath, indépendant du système de fichiers... D'ailleurs cela peut correspondre à un fichier simple, à un fichier à l'intérieur d'une archive, à un fichier distant... ou même à n'importe quoi d'autre si tu redéfinis ton propre ClassLoader...

    Citation Envoyé par ®om
    Par contre, je ne comprends pas très bien ce que signifie MaClass.class....
    Vu la syntaxe, on pourrait penser que class est un attribut, mais il n'en est rien - c un mot clé -.
    Disons qu'il s'agit d'un attribut "spécial" qui renvoit l'objet Class qui le représente...

    Citation Envoyé par ®om
    Et quelle est la différence avec getClass() quand on est dans une instance?
    Aucune : le même objet Class est retourné :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    System.out.println( new String().getClass().equals(String.class) );
    D'ailleur il n'y a qu'une seule et unique instance de Class par type de classe...

    La seule différence c'est que .class permet d'obtenir la Class sans pour autant avoir initialisé une instance de la classe... L'autre alternative étant la méthode statique Class.forName()...

    a++

  7. #7
    Membre Expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Par défaut
    OK, merci de ta réponse...

    Dans ce cas, au niveau de la conception, je ne vois pas pourquoi le getClass() n'a pas été déclaré static (vu que c'est le même pour toutes les instances)...
    Etonnant...
    Enfin, vu que c'est depuis java 1.0, faut pas chercher...

  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 ®om
    Dans ce cas, au niveau de la conception, je ne vois pas pourquoi le getClass() n'a pas été déclaré static (vu que c'est le même pour toutes les instances)...
    Tout simplement parce qu'il renvoit le vrai type de l'objet :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Object o = "hello";
     
    System.out.println( o.getClass() ); // renvoit String.class
    a++

  9. #9
    Membre Expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Par défaut
    Et pourquoi ni
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ClassLoader.getSystemResource("/img/image.png");
    ni
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ClassLoader.getSystemClassLoader().getSystemResource("/img/image.png");
    ne marchent pour charger l'image?

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

Discussions similaires

  1. Problème lecture des fichiers à partir du jar
    Par encours dans le forum Interfaces Graphiques en Java
    Réponses: 8
    Dernier message: 19/09/2011, 18h15
  2. Kettle, charger a partir d un fichier log
    Par hicham.gi dans le forum kettle/PDI
    Réponses: 3
    Dernier message: 22/05/2008, 19h36
  3. Charger fichier dans un jar
    Par Cobalt59 dans le forum Entrée/Sortie
    Réponses: 4
    Dernier message: 18/02/2008, 18h02
  4. Option de liste charger a partir de fichier
    Par crochepatte dans le forum Général JavaScript
    Réponses: 21
    Dernier message: 16/05/2007, 16h57
  5. [VB6]Charger des fichiers à partir d'un répertoire
    Par issaines dans le forum VB 6 et antérieur
    Réponses: 13
    Dernier message: 09/04/2006, 20h29

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