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.