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 :

Lecture de fichier impossible


Sujet :

Entrée/Sortie Java

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Développeur Java disponible
    Inscrit en
    Janvier 2018
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Java disponible
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2018
    Messages : 12
    Points : 7
    Points
    7
    Par défaut Lecture de fichier impossible
    Hey hey !

    J’espérais avoir besoin de l'aide de la communauté le plus tard possible mais là je suis sur un problème qui me dépasse et malgré pas mal de tentatives, la situation reste la même, je m'explique :

    Je développe une application qui génère automatiquement sa BDD si elle n'est pas déjà créée via des scripts SQL préparés, jusque là tout va bien car quand je "run " l'application via l'IDE, l'installation se passe sans problème.

    MAIS ! mais ! MAIS ! Lorsque je lance l'application via le .jar, je ne dispose pas des droits d'accès (fonction File.canRead() me renvoie false)me permettant de lire ces fichiers de script SQL.
    Je ne peux donc pas les parcourir et récupérer le texte pour injecter les scripts. :-(

    J'en appelle donc à votre magie vaudou et à votre connaissance du 42 pour m'aiguiller vers une solution.

    J'ai tenté de créer les fichiers directement via l'IDE...rien n'y change.

    Merci par avance à tous les Gandalfs du forum. XD

  2. #2
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    File.canRead?? Normalement ces scripts devraient se trouver dans ton jar, donc ce ne sont pas des fichiers, ce sont des ressources, à récupérer avec le classloader.

    A moins que tu aie une manière particulière de déployer ton application. Si c'est le cas, t'es sur de chercher les fichier au bon endroit? Le File.getAbsolutePath donne bien la bonne valeur?

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Développeur Java disponible
    Inscrit en
    Janvier 2018
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Java disponible
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2018
    Messages : 12
    Points : 7
    Points
    7
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    File.canRead?? Normalement ces scripts devraient se trouver dans ton jar, donc ce ne sont pas des fichiers, ce sont des ressources, à récupérer avec le classloader.

    A moins que tu aie une manière particulière de déployer ton application. Si c'est le cas, t'es sur de chercher les fichier au bon endroit? Le File.getAbsolutePath donne bien la bonne valeur?
    Les scripts sont bien présents dans mon jar.

    Et si je fais un file.getAbsolutePath(), il me donne le résultat C:\Users\utilisateur\Documents\NetBeansProjects\MyPass\dist\script\creationBdd.sql

    J'ai défini le path :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    private static final String SCRIPT_BDD = "script/creationBdd.sql";
    Et j'en suis au point où je veux le définir comme ressource avant son utilisation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    File scriptBdd = new File(SCRIPT_BDD); //SCRIPT_BDD étant l'adresse du fichier
    scriptBdd.getClass().getResourceAsStream(SCRIPT_BDD);
    Connexion.creerBdd(FileHelper.lireFichier(SCRIPT_BDD));
    Mais il reste en FileNotFoundException, le path qu'il me donne n'est pas bon car il faudrait rentrer dans le jar pour accéder au répertoire "script".

    Sachant que mes "ressources" sont dans un répertoire adjacents au répertoire "src" pour respecter les bonnes pratiques qu'on m'as conseillé sur ce forum.

    Nom : arbo.png
Affichages : 201
Taille : 6,7 Ko

    Du coup un peu d'aide ne serai pas de refus. ;-)

  4. #4
    Rédacteur

    Avatar de millie
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    7 015
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 015
    Points : 9 818
    Points
    9 818
    Par défaut
    Comme a indiqué tchize, sauf à utiliser une URL très particulière (à base de jar://jaioubliélasyntaxe), ceci ne fonctionne pas :

    File scriptBdd = new File(SCRIPT_BDD); //SCRIPT_BDD étant l'adresse du fichier

    Il faut partir sur un getResourceAsStream("/liendanslejar"/)

    edit : J'ai dit une bêtise. C'est des URL ou des Ressource que l'on peut obtenir avec l'url jar://file://etc.
    Je ne répondrai à aucune question technique en privé

  5. #5
    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 : 54
    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
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Oublie les File si tu travailles avec des ressources.

    Citation Envoyé par salocinski Voir le message
    Et si je fais un file.getAbsolutePath(), il me donne le résultat C:\Users\utilisateur\Documents\NetBeansProjects\MyPass\dist\script\creationBdd.sql
    C'est parce que tu es dans un cas particulier d'exécution où la ressource est aussi un fichier qui existe, puisque elle est bien dans le dossier en question. Lors du déploiement en Jar sur un autre poste, ton fichier local dans ton projet de développement n'est pas accessible par le chemin de fichier, voire pas accessible du tout (et heureusement).

    Dès lors qu'on travaille avec des ressources, on utiliser Class.getResource() ou Class.getResourceAsStream() (ou ClassLoader.getResource ou ClassLoader.getResourceAsStream()).

    Oublie donc aussi ton FileHelper. Il te suffit simplement d'avoir une méthode qui charge depuis un InputStream, et qui fonctionnera avec un File ou une URL, ou avec n'importe quel fournisseur de InputStream (Socket, Path, fichier Zippé, etc.). Tu peux toujours te faire des méthodes de convénience au besoin :
    Code : 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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    public class TextFileHelper {
    
    	
            /**
                * Lit un fichier texte depuis un flux d'octets entrant
                */
    	public static String lire(InputStream inputStream, Charset charset) throws IOException {
    		return new BufferedReader(new InputStreamReader(inputStream, charset)).lines().collect(Collectors.joining("\n"));
    	}
    
           // les méthodes qui suivent sont des méthodes de convenience qui s'appuient toutes sur la précédente
    
           /**
               * Lit un fichier texte depuis le filesystem
              */
           public static String lire(File file, Charset charset) throws IOException {
    	     try(FileInputStream inputStream = new FileInputStream(file)) {
    	        return lire(inputStream, charset);
    	     }
    	}
    
            /**
                * Lit un fichier texte depuis une URL
                */
    	public static String lire(URL url, Charset charset) throws IOException {
    	     try(InputStream inputStream = url.openStream()) {
    	        return lire(inputStream, charset);
    	     }
    	}
    
            /**
               * Lit un fichier depuis un path
               */
    	public static String lire(Path path, Charset charset) throws IOException {
    	     try(InputStream inputStream = Files.newInputStream(path)) {
    	        return lire(inputStream, charset);
    	     }
    	}
    
    
           /**
              * Lit un fichier depuis un fichier ZIP
              */
           public static String lire(File file, String entryName, Charset charset) throws IOException {
    		try(ZipFile zipfile = new ZipFile(file)) {
    			ZipEntry entry = zipfile.getEntry(entryName);
    			if ( entry==null ) {
    				throw new IOException("Entry not found");
    			}
    			if ( entry.isDirectory() ) {
    				throw new IOException("Entry is not file");
    			}
    			return lire(zipfile.getInputStream(entry),charset);
    		}
    	}
    
    }
    Et, là pour une ressource tu peux faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    String scriptSQL = TextFileHelper.lire(scriptBdd.getClass().getResource(SCRIPT_BDD));
    et pour un fichier (externe donc, pas quelque chose qui vient d'un jar) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    String scriptSQL = TextFileHelper.lire(new File("c:/temp/machin.sql"));
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    String scriptSQL = TextFileHelper.lire(Paths.get("c:/temp/machin.sql");
    Cela fonctionne dans tous les cas, mais chaque cas doit être traité de la manière adaptée.
    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.

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Développeur Java disponible
    Inscrit en
    Janvier 2018
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Java disponible
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2018
    Messages : 12
    Points : 7
    Points
    7
    Par défaut
    WAOUH !!!!

    Alors là je dois dire merci MONSIEUR !

    Tu viens de sauver ma santé mentale ! XD

    Je me suis permis de reprendre ton bout de code et de l'utiliser.

    Je vous remercie de l'aide apportée.

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

Discussions similaires

  1. [WD14] Lecture de Fichier xls impossible
    Par bruce207 dans le forum WinDev
    Réponses: 17
    Dernier message: 07/07/2011, 13h52
  2. Réponses: 2
    Dernier message: 12/05/2011, 19h11
  3. Lecture de fichier impossible
    Par rikau2 dans le forum C++
    Réponses: 4
    Dernier message: 02/07/2007, 16h30
  4. Réponses: 3
    Dernier message: 12/12/2006, 09h49
  5. Lecture de fichiers ".WAV"...
    Par 0x4e84 dans le forum Langage
    Réponses: 2
    Dernier message: 03/09/2002, 09h43

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