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 :

Problème d'espace dans un chemin


Sujet :

Langage Java

  1. #1
    Rédactrice

    Avatar de kalyparker
    Femme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Janvier 2007
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 327
    Points : 2 998
    Points
    2 998
    Par défaut Problème d'espace dans un chemin
    Bonjour à tous,
    fraichement débarqué dans le monde java, j'ai un peu de mal sur certain point.

    Je voudrais ouvrir un fichier qui se trouve dans le même repertoire que mes classes.
    J'ai donc trouvé ce topic qui répond partiellement à mon problème
    http://www.developpez.net/forums/sho...hlight=getpath

    J'ai donc fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    String toto = new File(ClassLoader.getSystemResource("").getPath()).getAbsolutePath();
    System.out.println(toto);
    Ce qui me donne à l'affichage quelque chose comme :
    D:\repertoire%20avec%20espace\Appli\Monappli\build\classes

    Le problème est que lorsque je me sert de ce chemin pour ouvrir un fichier j'ai une erreur :
    D:\repertoire%20avec%20espace\Appli\Monappli\build\classes\monfichier.xml (file name) doesn't found!

    Je voudrais donc virer les %20 pour les remplacer par un espace.
    J'ai penser faire un replace, mais ça ne fonctionne pas :
    toto.replace("%20",' ');
    Quelqu'un pourrait il me dire où est mon erreur ?
    Ou sinon est ce que quelqu'un à une autre solution à me proposer ?

    Merci

  2. #2
    Membre averti
    Inscrit en
    Juin 2003
    Messages
    292
    Détails du profil
    Informations forums :
    Inscription : Juin 2003
    Messages : 292
    Points : 317
    Points
    317
    Par défaut
    essaye
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    toto.replace("\%20"," ");

  3. #3
    Rédactrice

    Avatar de kalyparker
    Femme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Janvier 2007
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 327
    Points : 2 998
    Points
    2 998
    Par défaut
    merci de ta réponse jhaythem,
    cela dit, ça n'a pas l'air de marcher --> illegal escape character

    Je continue à chercher...

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    57
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 57
    Points : 68
    Points
    68
    Par défaut
    essaye
    replaceall
    ou
    while (il reste des espaces) replace

    suivant si tu est en 1.5 ou 1.4

  5. #5
    Membre averti
    Inscrit en
    Juin 2003
    Messages
    292
    Détails du profil
    Informations forums :
    Inscription : Juin 2003
    Messages : 292
    Points : 317
    Points
    317
    Par défaut
    ok desole, c etait juste un guess rapide, je croyais que le % etait interprete comme un metacaracheter.
    voila a ta place ce que je ferais juste pour tester j essayerais avec un \ un \\ et un \\\\ ouai c est louche mais c est comme ca. je crois que ca va dependre de ta jvm et aussi de ton os.
    bonne chance et je si je trouve d autres trucs je te ferais savoir...

  6. #6
    Rédactrice

    Avatar de kalyparker
    Femme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Janvier 2007
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 327
    Points : 2 998
    Points
    2 998
    Par défaut
    voila a ta place ce que je ferais juste pour tester j essayerais avec un \ un \\ et un \\\\ ouai c est louche mais c est comme ca. je crois que ca va dependre de ta jvm et aussi de ton os.
    J'ai déjà testé merci

    Mais grâce à vous j'ai la solution :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     String toto = new File(ClassLoader.getSystemResource("").getPath()).getAbsolutePath();
    toto = toto.replaceAll("%20"," ");
    System.out.println(toto);
    je comprend pas trop pourquoi il faut affecter toto à lui même, mais ça marche

    Encore une fois merci à vous deux

  7. #7
    Membre averti
    Inscrit en
    Juin 2003
    Messages
    292
    Détails du profil
    Informations forums :
    Inscription : Juin 2003
    Messages : 292
    Points : 317
    Points
    317
    Par défaut
    je viens de tester sur 1.5 et ca marche parfaitement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    chaine.replaceAll("\\%20", " ");

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    57
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 57
    Points : 68
    Points
    68
    Par défaut
    Citation Envoyé par jhaythem Voir le message
    je viens de tester sur 1.5 et ca marche parfaitement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    chaine.replaceAll("\\%20", " ");
    ça ça remplace \%20 par espace

  9. #9
    Membre averti
    Inscrit en
    Juin 2003
    Messages
    292
    Détails du profil
    Informations forums :
    Inscription : Juin 2003
    Messages : 292
    Points : 317
    Points
    317
    Par défaut
    Citation Envoyé par XSeb74 Voir le message
    ça ça remplace \%20 par espace
    non ca ca remplace %20 par un espace, donc mon guess etait correct la premiere fois le % est un methacharacter.

    tu peux toujours tester ma reponse si tu ne me crois pas

  10. #10
    Membre chevronné
    Avatar de Deadpool
    Homme Profil pro
    Inscrit en
    Novembre 2005
    Messages
    1 312
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2005
    Messages : 1 312
    Points : 2 011
    Points
    2 011
    Par défaut
    Citation Envoyé par kalyparker Voir le message

    je comprend pas trop pourquoi il faut affecter toto à lui même, mais ça marche

    Encore une fois merci à vous deux
    C'est parce que la classe String est dite inaltérable c'est à dire qu'il n'est pas possible de modifier une instance de la classe String une fois que celle-ci a été créée, chaque opération créer une nouvelle instance que tu dois affecter à ta variable pour en sauvegarder le résultat.

    Pour illustrer ça avec un exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    String s = "toto";
    s.toUpperCase();
    System.out.println(s); // affiche toto
    Là je fais simplement appel à la méthode toUppercase cependant comme la classe String est inaltérable la valeur de s n'est pas modifiée.

    Maintenant si je fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    String s = "toto";
    s = s.toUpperCase();
    System.out.println(s); // affiche TOTO
    Dans ce cas la valeur de s a changé car on a lui affecté le résultat de la méthode toUpperCase (qui renvoie une nouvelle instance correspond à la valeur de s mise en majuscule).

    J'espère que je suis clair dans mes explications.

    En java, beaucoup de classes sont inaltérables (String, les classes Wrapper du style Integer, Character, Long etc...), ça offre plusieurs avantages notamment la possibilité de partager leur instances sans besoin de synchronisation entre plusieurs threads.

  11. #11
    Rédactrice

    Avatar de kalyparker
    Femme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Janvier 2007
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 327
    Points : 2 998
    Points
    2 998
    Par défaut
    C'est parce que la classe String est dite inaltérable c'est à dire qu'il n'est pas possible de modifier une instance de la classe String une fois que celle-ci a été créée, chaque opération créer une nouvelle instance que tu dois affecter à ta variable pour en sauvegarder le résultat.
    Ok merci pour l'info

    Maintenant que j'ai compris comment modifier ma chaine :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    chaine.replaceAll("\\%20", " ");
    marche aussi en 1.6 !

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    57
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 57
    Points : 68
    Points
    68
    Par défaut
    ceci dit je comprend pas pourquoi ça lui retourne des %20

  13. #13
    Expert éminent sénior
    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
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,

    Citation Envoyé par XSeb74 Voir le message
    ceci dit je comprend pas pourquoi ça lui retourne des %20
    Parce que getResource() retourne une URL et qu'une URL ne possède pas d'espace (ils sont encodé par des %20).

    Par contre il vaudrait mieux passer par le constructeur File(URI) afin d'éviter un remplacement de caractère qui n'est pas forcément complet (d'autres caractères pourraient poser problème...) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    String toto = new File( ClassLoader.getSystemResource("").toURI() ).getAbsolutePath();

    Enfin il faut également se méfier de ClassLoader.getSystemResource("") qui peut renvoyer null dans certain cas (lorsqu'on lance un jar exécutable par exemple).

    a++

  14. #14
    Rédactrice

    Avatar de kalyparker
    Femme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Janvier 2007
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 327
    Points : 2 998
    Points
    2 998
    Par défaut
    Enfin il faut également se méfier de ClassLoader.getSystemResource("") qui peut renvoyer null dans certain cas (lorsqu'on lance un jar exécutable par exemple).
    Ce que tu me dit là me fait peur adiGuba !
    ça veux dire qu'en java, il n'est pas possible de récuperer le chemin de notre programme sans être sur à 100% que ça va marcher !

    Tu précise que c'est lorsque l'on lance un jar executable que ça peux poser problème, là tu m'a perdu
    Je ne sais pas comment on utilise un jar executable... je crois que je ne sais d'ailleurs meme pas ce que c'est
    Par contre je ne pense pas que j'aurai à m'en servir, et là je voudrais ton avis parce que (trop newbie pour être sure) :
    Si je fait une appli swing/awt qui devra tourner sur windows, j'ai 2 packages : GUI et IA, est ce que ClassLoader.getSystemResource("") passera à tous les coups ?
    parce que mon fichier de paramétrage de cette appli se trouvera toujours dans le même repertoire que les classes, et si je ne peux pas y acceder, ben l'appli elle marchera pas

    [edit]
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    String toto = new File(ClassLoader.getSystemResource("").toURI()).getAbsolutePath();
    J'ai testé, mais j'arrive pas à compiler ?!
    [/edit]

  15. #15
    Expert éminent sénior
    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
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par kalyparker Voir le message
    Ce que tu me dit là me fait peur adiGuba !
    ça veux dire qu'en java, il n'est pas possible de récuperer le chemin de notre programme sans être sur à 100% que ça va marcher !
    Non. getSystemResource() ne sert pas à récupérer l'emplacement du programme mais à rechercher des ressources dans le classpath. De plus tu l'utilise d'une manière anormal (sans nom), ce qui a un effet aléatoire et qui dépend de ton classpath (lorsqu'il comporte un répertoire standard cela semble marcher, mais pas lorsque c'est un jar).



    Citation Envoyé par kalyparker
    Tu précise que c'est lorsque l'on lance un jar executable que ça peux poser problème, là tu m'a perdu
    Je ne sais pas comment on utilise un jar executable... je crois que je ne sais d'ailleurs meme pas ce que c'est
    Il s'agit simplement d'une archive (format ZIP) qui contient les classes et les ressources de ton applications, et qui permet d'exécuter le programme plus simplement. Plus d'info : Comment créer un jar exécutable ?

    A titre d'info j'ai testé le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    	public static void main(String[] args) {
     
    		URL url = ClassLoader.getSystemResource("");
    		System.out.println(url);
     
    	}
    Cela marche lorsque le classpath comporte un répertoire (c'est alors ce dernier qui est renvoyé comme résultat), mais en aucun cas lorsque c'est un jar exécutable ou que le classpath ne comporte que des archives jar...



    Citation Envoyé par kalyparker
    j'ai 2 packages : GUI et IA, est ce que ClassLoader.getSystemResource("") passera à tous les coups ?
    Cela ne dépend pas de tes packages mais plutôt de la manière dont tu vas déployer l'application...


    Citation Envoyé par kalyparker
    parce que mon fichier de paramétrage de cette appli se trouvera toujours dans le même repertoire que les classes, et si je ne peux pas y acceder, ben l'appli elle marchera pas
    Ce fichier de configuration doit-il être modifié par ton programme ? Sinon le plus simple est de le mettre dans le classpath...

    Sinon il existe une solution pour récupérer le répertorie par rapport à une classe mais ce n'est pas forcément la meilleure solution...


    Pourquoi ne pas mettre le fichier de config dans le user.home ???



    Citation Envoyé par kalyparker
    J'ai testé, mais j'arrive pas à compiler ?!
    C'est à dire ?

    a++

  16. #16
    Rédactrice

    Avatar de kalyparker
    Femme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Janvier 2007
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 327
    Points : 2 998
    Points
    2 998
    Par défaut
    Merci pour toutes ces précisions

    Ce fichier de configuration doit-il être modifié par ton programme ? Sinon le plus simple est de le mettre dans le classpath...
    Je vais essayer ça !
    ça à l'air d'être une meilleur solution (disons que ça ressemble moins à du bricolage )


    Citation:
    Envoyé par kalyparker
    J'ai testé, mais j'arrive pas à compiler ?!
    C'est à dire ?
    Nan, laisses tomber c'etait une erreur un peu plus haut dans mon code... Une journée complete sur java ça laisse des traces

    Encore une fois merci à tous pour toutes ces précisions je vais pouvoir avancer !
    @+ sur le forum

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 08/07/2011, 22h23
  2. Problème d'espace dans le chemin d'accès d'une vidéo avec VLC
    Par Krovax dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 26/08/2009, 12h56
  3. Problème d'espaces dans les chemins avec Cygwin
    Par destructive dans le forum Applications et environnements graphiques
    Réponses: 1
    Dernier message: 14/04/2008, 17h48
  4. [VBS] Gestion des espaces dans le chemin de fichiers
    Par Edoxituz dans le forum VBScript
    Réponses: 4
    Dernier message: 23/02/2006, 16h41
  5. [DOS] Espace dans le chemin et lancement de fichier
    Par nahzhir dans le forum Scripts/Batch
    Réponses: 16
    Dernier message: 20/02/2006, 09h27

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