2012-06-28 12 views
15

Ho la seguente struttura percorso per la classe principale:Come leggere un file delle proprietà in java dall'esterno della cartella Class?

D:/java/myapp/src/manClass.java 

e voglio mettere il file delle proprietà in

D:/java/myapp/config.properties 

che conterrà un nome di file e alcune altre configurazioni. Io misi il nome del file nel file di proprietà in questo modo: file=file_to_read.txt

questo file_to_read.txt sarà situato in D:/java/myapp/folder_of_file/

La classe principale leggerà il nome del file il file prima delle proprietà e quindi ottenere il contenuto formano file .

Posso farlo se entrambi config.properties e file_to_read.txt sono in src/ con mainClass.java. Ma non potrei riuscire nel modo in cui voglio farlo.

Qualcuno può aiutarmi con questo? Ho bisogno del tuo suggerimento su cosa posso fare se voglio mettere la cartella myapp in qualsiasi punto della mia unità con la stessa struttura interna in essa descritta sopra e il programma farà il lavoro correttamente.

Ho anche bisogno del tuo suggerimento che se voglio fare il lavoro dal vaso creato dopo la costruzione del progetto, allora posso farlo senza problemi?

Ho provato come la seguente solo per leggere il file delle proprietà:

 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")); 

Ma questo dà sbagliare quando cercato di getProperty dalle file delle proprietà. Grazie!

risposta

0

È possibile aggiungere la directory del file di configurazione al percorso classe di runtime, quindi è possibile accedervi con Class.getResourceAsStream().

28

Come leggere un file di proprietà in java da di fuori della cartella Classe?

Usa FileInputStream con un percorso del file system del disco fisso.

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

Molto meglio è quello di spostare solo che uno dei percorsi esistenti oggetto del percorso di classe, invece, o per aggiungere il suo percorso originale D:/java/myapp/ al classpath. Poi si può ottenere come segue:

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

o

InputStream input = Thread.currentThread().getContextClassLoader().getResourceAsStream("config.properties"); 
+1

Sì, utilizzare la prima soluzione di BalusC. – Klinetel

+0

Grazie, ha funzionato per me. Ma, ho bisogno di aggiungere un commento. Se si aggiunge la cartella al classpath, non è necessario specificare la cartella quando si ottiene la risorsa come stream, significa che è sufficiente chiamare getResourceAsStream ("/ config.properties") anche se tale file si trova in una cartella denominata risorse –

+1

@Jesus: Sì, è intenzionato utilizzare il contenuto della cartella nello stesso modo di tutte quelle altre cartelle già nel percorso di classe (predefinito). – BalusC

6

Grazie a tutti per i vostri suggerimenti. Ho fatto il lavoro in questo modo:

 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*/ 
+1

Questo non è molto portabile, o dovresti documentarlo molto chiaramente nella guida all'installazione della tua app. È sufficiente aggiungere semplicemente classpath o aggiungere il percorso al classpath. – BalusC

+0

@BalusC, cosa succede se volevo modificare il file delle proprietà durante l'esecuzione? – gdrt

0

È necessario specificare il percorso assoluto, ma non si deve codificare come che renderà più difficile per la commutazione tra sviluppo e ambiente di produzione, ecc ..

È possibile ottenere il percorso di base dei file da una proprietà di sistema a cui è possibile accedere utilizzando System.getProperty ("basePath") nel codice e che deve essere anteposto al nome del file per creare un percorso assoluto .

Durante l'esecuzione dell'applicazione è possibile specificare il percorso nella riga di comando java come segue:

java -DbasePath="https://stackoverflow.com/a/b/c" ... 

... significa gli argomenti attuali al comando Java per eseguire il programma.

2
Properties property=new Properties(); 
property.load(new FileInputStream("C:/java/myapp/config.properties")); 
Problemi correlati