Caricamento di un file delle proprietà dal pacchetto Java


115

Ho bisogno di leggere un file delle proprietà che è sepolto nella struttura del mio pacchetto in com.al.common.email.templates.

Ho provato di tutto e non riesco a capirlo.

Alla fine, il mio codice verrà eseguito in un contenitore servlet, ma non voglio dipendere dal contenitore per nulla. Scrivo casi di test JUnit e deve funzionare in entrambi.

Risposte:


235

Quando si caricano le proprietà da una classe nel pacchetto com.al.common.email.templatesè possibile utilizzare

Properties prop = new Properties();
InputStream in = getClass().getResourceAsStream("foo.properties");
prop.load(in);
in.close();

(Aggiungi tutta la gestione delle eccezioni necessaria).

Se la tua classe non è in quel pacchetto, devi acquisire InputStream in modo leggermente diverso:

InputStream in = 
 getClass().getResourceAsStream("/com/al/common/email/templates/foo.properties");

I percorsi relativi (quelli senza una '/' iniziale) in getResource()/ getResourceAsStream()significano che la risorsa verrà cercata in relazione alla directory che rappresenta il pacchetto in cui si trova la classe.

L'utilizzo java.lang.String.class.getResource("foo.txt")cercherebbe il file (inesistente) /java/lang/String/foo.txtsul classpath.

L'uso di un percorso assoluto (uno che inizia con "/") significa che il pacchetto corrente viene ignorato.


2
Suggerimento: aggiungi una spiegazione quando usare relativo e quando usare percorsi assoluti (con e senza la "/" all'inizio).
Aaron Digulla

1
cosa succede se il tuo file delle proprietà è fuori dalla directory src ma ancora all'interno del tuo project director?
Jonathan

1
@jonney: Java stesso non ha la nozione di "directory del progetto", alcuni IDE potrebbero averla. Ma per quanto riguarda Java, è semplicemente un file da qualche parte nel file system senza alcuna relazione con il classpath.
Joachim Sauer

50

Per aggiungere alla risposta di Joachim Sauer, se hai mai bisogno di farlo in un contesto statico, puoi fare qualcosa di simile a quanto segue:

static {
  Properties prop = new Properties();
  InputStream in = CurrentClassName.class.getResourceAsStream("foo.properties");
  prop.load(in);
  in.close()
}

(Gestione delle eccezioni elisa, come prima.)


Questa è la risposta che ha funzionato per me. Non sono riuscito a far funzionare la risposta accettata.
Steve HHH

1
@cobralibre come leggere un file delle proprietà che risiede in una resourcescartella in un mavenprogetto
Kasun Siyambalapitiya

16

I due casi seguenti si riferiscono al caricamento di un file delle proprietà da una classe di esempio denominata TestLoadProperties.

Caso 1: caricamento del file delle proprietà utilizzando ClassLoader

InputStream inputStream = TestLoadProperties.class.getClassLoader()
                          .getResourceAsStream("A.config");
properties.load(inputStream);

In questo caso, il file delle proprietà deve essere nella root/srcdirectory per un caricamento corretto.

Caso 2: caricamento del file delle proprietà senza utilizzare ClassLoader

InputStream inputStream = getClass().getResourceAsStream("A.config");
properties.load(inputStream);

In questo caso, il file delle proprietà deve trovarsi nella stessa directory del TestLoadProperties.classfile per un caricamento corretto.

Nota: TestLoadProperties.java e TestLoadProperties.classsono due file diversi. Il primo, .javafile, si trova solitamente nella src/directory di un progetto , mentre il secondo, .classfile, si trova solitamente nella sua bin/directory.


12
public class Test{  
  static {
    loadProperties();
}
   static Properties prop;
   private static void loadProperties() {
    prop = new Properties();
    InputStream in = Test.class
            .getResourceAsStream("test.properties");
    try {
        prop.load(in);
        in.close();
    } catch (IOException e) {
        e.printStackTrace();
    }

}

10
public class ReadPropertyDemo {
    public static void main(String[] args) {
        Properties properties = new Properties();

        try {
            properties.load(new FileInputStream(
                    "com/technicalkeeda/demo/application.properties"));
            System.out.println("Domain :- " + properties.getProperty("domain"));
            System.out.println("Website Age :- "
                    + properties.getProperty("website_age"));
            System.out.println("Founder :- " + properties.getProperty("founder"));

            // Display all the values in the form of key value
            for (String key : properties.stringPropertyNames()) {
                String value = properties.getProperty(key);
                System.out.println("Key:- " + key + "Value:- " + value);
            }

        } catch (IOException e) {
            System.out.println("Exception Occurred" + e.getMessage());
        }

    }
}

2

Supponendo che tu stia utilizzando la classe Properties , tramite il suo metodo di caricamento , e immagino che tu stia utilizzando ClassLoader getResourceAsStream per ottenere il flusso di input.

Come stai passando il nome, sembra che dovrebbe essere in questa forma: /com/al/common/email/templates/foo.properties


1

Sono riuscito a risolvere questo problema con questa chiamata

Properties props = PropertiesUtil.loadProperties("whatever.properties");

Inoltre, devi mettere il tuo file any.properties in / src / main / resources


9
Da dove vieni PropertiesUtil?
Ben Watson

1

Nessuno menziona la soluzione simile ma anche più semplice di quella precedente senza la necessità di occuparsi del pacchetto della classe. Supponendo che myfile.properties sia nel classpath.

        Properties properties = new Properties();
        InputStream in = ClassLoader.getSystemResourceAsStream("myfile.properties");
        properties.load(in);
        in.close();

Godere


-2

usa il codice sottostante per favore:

    Proprietà p = nuove proprietà (); StringBuffer path = nuovo StringBuffer ( "com / al / common / email / templates /" ); 
    percorso . append ( "foo.properties" ); InputStream fs = getClass (). getClassLoader () . getResourceAsStream ( path . toString ());   
      
    
                                    

if(fs == null){ System.err.println("Unable to load the properties file"); } else{ try{ p.load(fs); } catch (IOException e) { e.printStackTrace(); } }
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.