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

NetBeans Java Discussion :

Lecture/Ecriture sur fichier dans Netbeans


Sujet :

NetBeans Java

  1. #1
    Membre régulier Avatar de NizarK
    Inscrit en
    Mars 2007
    Messages
    189
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 189
    Points : 122
    Points
    122
    Par défaut Lecture/Ecriture sur fichier dans Netbeans

    Je travaille sur netbeans et je souhaite réaliser la lecture et l'écriture sur des fichiers...
    ça parait facile mais le soucis c'est d'arriver à ne rien changer quand un génère un jar avec build et qu'on l'appelle à partir de la console.

    Pour la lecture, j'ai trouvé la solution suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    props.load(getClass().getResourceAsStream("/admin/resources/properties/configuration.properties"));
    ça marche très bien même avec le jar.

    Par contre pour l'écriture, je n'ai pas trouvé de solution : j'ai essayé avec ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    File f = new File(getClass().getResource("/admin/resources/password").toURI());
     
                            fw = new FileWriter(f, false);
                            fw.write(dig_new_pass);
                            fw.flush();
                            fw.close();
    mais j'ai une exception :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    java.lang.IllegalArgumentException: URI is not hierarchical
    une solution ???

  2. #2
    Membre régulier Avatar de NizarK
    Inscrit en
    Mars 2007
    Messages
    189
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 189
    Points : 122
    Points
    122
    Par défaut
    Ma Question n'est peut être pas assez claire :

    Comment appeler un fichier avec un path relatif pour le lire / y écrire de manière à ce que ce même path reste valide même quand on "build" le projet et qu'on l'éxécute à partir du jar avec :
    java -jar monprojet.jar

  3. #3
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Points : 7 163
    Points
    7 163
    Par défaut
    Il n'est pas possible de modifier directement un fichier dans un jar.
    Il faut d'abord écrire un fichier, puis refaire tout le jar avec le nouveau fichier.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
    Que la force de la puissance soit avec le courage de ta sagesse.

  4. #4
    Membre régulier Avatar de NizarK
    Inscrit en
    Mars 2007
    Messages
    189
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 189
    Points : 122
    Points
    122
    Par défaut
    Merci pour ta réponse dinobogan ...
    Je ne peux pas faire ça en cours d'éxécution ( écrire le fichier et refaire le jar ).
    si ?
    Autre solution :
    Quelqu'un a t il une idée sur le path relatif pour accèder à un fichier qui se trouve dans le même répertoire que le jar ...
    Ainsi je laisserai mon fichier properties à côté du jar et je pourrai lire et écrire ..

  5. #5
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Points : 7 163
    Points
    7 163
    Par défaut
    Citation Envoyé par NizarK Voir le message
    Merci pour ta réponse dinobogan ...
    Je ne peux pas faire ça en cours d'éxécution ( écrire le fichier et refaire le jar ).
    si ?
    Non, il ne faut pas faire ça.
    Pour écrire un fichier pour l'application, tu décides toi-même d'un répertoire à partir du répertoire courant.
    Tu obtiens le répertoire courant par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    File courant = new File( "." );
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
    Que la force de la puissance soit avec le courage de ta sagesse.

  6. #6
    Membre régulier Avatar de NizarK
    Inscrit en
    Mars 2007
    Messages
    189
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 189
    Points : 122
    Points
    122
    Par défaut
    Toujours aucune solution ..

    Pour ta solution dinobogan ça ne marche pas du tout car en faisant File(".") il pointe sur le chemin racine du projet en lui ajoutant le signe "." ce qui fait que si tu fais File("./properties/conf.properties") ça donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    /chemin/du/projet/. /properties/conf.properties
    ce qui ne correspond à rien du tout


    Je n'arrive pas à trouver une façon d'accèder à un fichier properties pour y lire et y écrire et que cette façon reste valable lors du développement et après formation du jar .

    Personne n'a jamais eu à lire et à écrire à partir d'un fichier properties

  7. #7
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Points : 7 163
    Points
    7 163
    Par défaut
    Citation Envoyé par NizarK Voir le message
    Personne n'a jamais eu à lire et à écrire à partir d'un fichier properties
    Dans mes applications, j'utilise exactement cette méthode. L'appli accède au fichier properties via un chemin relatif. Dans l'IDE, c'est la même chose. Je ne comprends pas du tout ton problème.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
    Que la force de la puissance soit avec le courage de ta sagesse.

  8. #8
    Membre régulier Avatar de NizarK
    Inscrit en
    Mars 2007
    Messages
    189
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 189
    Points : 122
    Points
    122
    Par défaut
    Le problème est : est ce que tu as utilisé ça avec netbeans ..
    Parce qu'avec netbeans le problème est un peu plus compliqué ...
    Si tu regardes le post d'avant j'ai expliqué comment il interprétait le File(".").

    Moi aussi quand j'utilisais eclipse ça marchait .. mais avec netbeans j'ai des problèmes.

  9. #9
    Membre chevronné
    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
    Points : 2 208
    Points
    2 208
    Par défaut
    Bonjour,

    Et avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    getClass().getResource("../fichier.properties")
    ? pour un fichier au même niveau que le jar

    @+


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

  10. #10
    Membre régulier Avatar de NizarK
    Inscrit en
    Mars 2007
    Messages
    189
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 189
    Points : 122
    Points
    122
    Par défaut
    Merci d'avoir répondu aussi vite afrikha.
    Non ça n'a pas marché ..
    voilà ce que j'ai fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    package testreadjar;
    import java.util.Properties;
    public class Main {
        public static void main(String[] args) {
           propsLoader p = new propsLoader();
           Properties pop = p.loadProps("../config.properties");
           System.out.println(pop.getProperty("database.driver"));
        }
    }
    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
     
    package testreadjar;
     
    import java.io.IOException;
    import java.util.Properties;
    import java.util.logging.Level;
    import java.util.logging.Logger;
    public class propsLoader {
    public Properties loadProps(String path)
    {
        Properties props=null;
            try {
                props = new Properties();
                props.load(getClass().getResourceAsStream(path));
            } catch (IOException ex) {
                Logger.getLogger(propsLoader.class.getName()).log(Level.SEVERE, null, ex);
            }
            return props;
    }       
    }
    j'ai aussi joint l'image de l'arborescence
    Images attachées Images attachées  

  11. #11
    Membre chevronné
    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
    Points : 2 208
    Points
    2 208
    Par défaut
    Pense à faire un clean/build de ton projet et indique-nous l'exception obtenue

    @+


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

  12. #12
    Membre régulier Avatar de NizarK
    Inscrit en
    Mars 2007
    Messages
    189
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 189
    Points : 122
    Points
    122
    Par défaut
    Je fais bien sur un clean/build du projet et puis je copie/colle le fichier properties dans le répertoire dist .. j'éxécute ensuite avec

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    java6 -jar "/chemin/vers/netbeansprojects/TestReadJar/dist/TestReadJar.jar"
    et j'obtiens ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Exception in thread "main" java.lang.NullPointerException
            at java.util.Properties$LineReader.readLine(Properties.java:418)
            at java.util.Properties.load0(Properties.java:337)
            at java.util.Properties.load(Properties.java:325)
            at testreadjar.propsLoader.loadProps(propsLoader.java:23)
            at testreadjar.Main.main(Main.java:22)

  13. #13
    Membre régulier Avatar de NizarK
    Inscrit en
    Mars 2007
    Messages
    189
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 189
    Points : 122
    Points
    122
    Par défaut
    Voilà ce que j'ai trouvé en cherchant bien sur developpez :

    Citation Envoyé par George7 Voir le message
    Salut,
    Il me semble que modifier un jar est impossible...
    Accéder à ton fichier properties est possible depuis l'extérieur du jar. si tu as cette architecture :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    root
      |_ program.jar
      |_ config
           |_ config.properties
    Tu peux y accéder simplement avec la classe Properties (plus adaptée à mon sens que ResourceBundle, qui est mieux pour traduire une application plutôt), la méthode Properties.load() et la méthode Properties.getProperty()
    Tu fais un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Properties prop = new Properties();
    prop.load(new FileInputStream(new File("config/config.properties")));
    prop.getProperty("option");
    Tschau

    EDIT : pour écrire dans ton fichier d'options, utilise la méthode store de la classe Properties
    Le problème c'est que ça ne marche pas non plus pour moi ... ????!!!!!!
    Pourtant c'est exactemet ce que je veux faire.

  14. #14
    Membre chevronné
    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
    Points : 2 208
    Points
    2 208
    Par défaut
    Bonjour,

    Voici un bout de code qui marche, tu peux essayer de t'en inspirer :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    public class Main {
     
        /**
         * @param args the command line arguments
         */
        public static void main(String[] args) throws FileNotFoundException, IOException {
            File configFile = new File("props/config.txt");
            System.out.println(configFile.getPath());
        }
    }
    Ensuite j'ai fait un clean/build puis dans le dossier Dist j'ai rajouté un dossier props contenant un fichier config.txt. Voici la structure du dossier :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    -dist
    |
     ---test.jar
    |
     ---props
        |
         ---config.txt
    Ensuite, dans l'invite de commande je me suis placé dans le dist et tapé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    java -jar test.jar
    et j'otiens bien à l'affichage :
    S'il arrive à créer l'objet File, il devrait pouvoir le lire

    Voilà, Bon courage


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

  15. #15
    Membre régulier Avatar de NizarK
    Inscrit en
    Mars 2007
    Messages
    189
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 189
    Points : 122
    Points
    122
    Par défaut SOLUTION
    La ou les questions étaient :
    1- Comment arriver à lire et écrire dans un fichier properties alors que notre application est compilée sous forme de jar éxécutable
    2- Quel chemin relatif utiliser et où placer le fichier properties
    3- Comment faire pour que ce chemin reste le même lors du développement sur NETBEANS et après build du jar et qu'on n'est pas à changer le code source à chaque déploiement
    4- Et tout ça sur Netbeans

    Et la réponse est :
    Pour lire et écrire il faut appeler le fichier avec le path relatif suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    File conf_file = new File("conf/config.properties");
    Lors du développement, le dossier conf doit être placé directement sous le répertoire du projet netbeans comme l'image arbo_netbeans ci-dessous.

    Lors du déploiement sous forme de jar , le dossier conf doit être placé au même niveau que le jar quelque soit le dossier qui les contient. voir image arbo_jar ci dessous.
    et Enfin très important lors de l'éxécution du jar à partir de la console bien s'assurer qu'on s'est placé sous le répertoire qui contient le jar ( car de là venait l'erreur )
    Merci à tous et surtout à anis
    Images attachées Images attachées  

  16. #16
    Membre régulier Avatar de NizarK
    Inscrit en
    Mars 2007
    Messages
    189
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 189
    Points : 122
    Points
    122
    Par défaut
    et le code complet de l'application de test :
    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
     
    package testreadjar;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.util.Properties;
    import java.util.logging.Level;
    import java.util.logging.Logger;
     
    public class Main {
        public static void main(String[] args) {
            try {
                Properties props = new Properties();
                File conf_file = new File("conf/config.properties");
                FileInputStream fis_props = new FileInputStream(conf_file);
                props.load(fis_props);
                System.out.println(props.getProperty("database.driver"));
                fis_props.close();
                FileOutputStream fos_props = new FileOutputStream(conf_file);
                props.put("testProperty", "testValue");
                props.store(fos_props , "");
                fos_props.flush();
                fos_props.close();
            } catch (IOException ex) {
                Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
     
    }

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

Discussions similaires

  1. Lecture/ecriture sur un fichier
    Par div.habib dans le forum x86 16-bits
    Réponses: 1
    Dernier message: 24/02/2011, 19h13
  2. AWK: LectureS/ecriture sur fichier
    Par Super_babar dans le forum Linux
    Réponses: 1
    Dernier message: 15/10/2007, 23h33

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