web-dev-qa-db-fra.com

Comment lire un fichier de propriétés dans Java depuis l'extérieur du dossier Class?

J'ai la structure de chemin d'accès suivante à la classe principale:

D:/Java/myapp/src/manClass.Java

et je veux mettre le fichier de propriétés

D:/Java/myapp/config.properties

qui contiendra un nom de fichier et quelques autres configurations. Je vais définir le nom du fichier dans le fichier de propriétés comme ceci: file=file_to_read.txt

cette file_to_read.txt sera situé dans D:/Java/myapp/folder_of_file/

La classe principale lira d'abord le nom du fichier dans le fichier de propriétés, puis récupérera le contenu du fichier.

Je peux le faire si les deux config.properties et file_to_read.txt sont dans src/ avec le mainClass.Java. Mais ne pouvait pas réussir avec la façon dont je veux le faire.

Quelqu'un peut-il m'aider avec ça? J'ai besoin de votre suggestion sur ce que je peux faire si je veux placer le dossier myapp n'importe où dans mon lecteur avec la même structure interne que celle décrite ci-dessus et le programme fera le travail correctement.

J'ai également besoin de votre suggestion que si je veux faire le travail à partir du pot créé après la construction du projet, puis-je le faire sans aucun problème?

J'ai essayé comme suit juste pour lire le fichier de propriétés:

        URL location = myClass.class.getProtectionDomain().getCodeSource().getLocation();

        String filePath = location.getPath().substring(1,location.getPath().length());

        InputStream in = myClass.class.getResourceAsStream(filePath + "config.properties");
        prop.load(in);

        in.close();

        System.out.println(prop.getProperty("file"));

Mais cela donne une erreur lorsque vous essayez d'obtenir getProperty à partir du fichier de propriétés. Merci!

21
flyleaf

Comment lire un fichier de propriétés dans Java depuis en dehors du dossier Class?

Utilisez FileInputStream avec un chemin d'accès au système de fichiers sur disque fixe.

InputStream input = new FileInputStream("D:/Java/myapp/config.properties");

Il est préférable de simplement le déplacer vers l'un des chemins existants couverts par le chemin de classe ou d'ajouter son chemin d'origine D:/Java/myapp/ au chemin de classe. Ensuite, vous pouvez l'obtenir comme suit:

InputStream input = getClass().getResourceAsStream("/config.properties");

ou

InputStream input = Thread.currentThread().getContextClassLoader().getResourceAsStream("config.properties");
32
BalusC

Merci à tous pour vos suggestions. J'ai fait le travail de cette façon:

        Properties prop = new Properties();
        String dir = System.getProperty("user.dir");
        InputStream in = new FileInputStream(dir + "/myapp/config.properties");
        prop.load(in);
        in.close();
        String filePath = dir + "/myapp/folder_of_file/" + prop.getProperty("file"); /*file contains the file name to read*/
9
flyleaf
Properties property=new Properties();
property.load(new FileInputStream("C:/Java/myapp/config.properties"));
4
codehacker

Vous devez spécifier un chemin absolu mais vous ne devez pas le coder en dur car cela rendra plus difficile le basculement entre l'environnement de développement et de production, etc.

Vous pouvez obtenir le chemin de base du ou des fichiers à partir d'une propriété système à laquelle vous pouvez accéder à l'aide de System.getProperty ("basePath") dans votre code et qui doit être ajouté à votre nom de fichier pour créer un chemin absolu.

Lors de l'exécution de votre application, vous pouvez spécifier le chemin dans la ligne de commande Java comme suit:

Java -DbasePath="/a/b/c" ...

... signifie les arguments actuels de votre commande Java pour exécuter votre programme.

3