Domanda

Devo leggere un file delle proprietà che è sepolto nella mia struttura del 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.

È stato utile?

Soluzione

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 necessaria gestione delle eccezioni).

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 un '/' iniziale) in getResource () / getResourceAsStream () significano che la risorsa verrà cercata relativamente alla directory che rappresenta il pacchetto in cui si trova la classe.

Utilizzando java.lang.String.class.getResource (" foo.txt ") si cerca il file (inesistente) /java/lang/String/foo.txt sul percorso di classe.

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

Altri suggerimenti

Per aggiungere alla risposta di Joachim Sauer, se mai hai bisogno di farlo in un contesto statico, puoi fare qualcosa del tipo:

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

(Gestione delle eccezioni eliminata, come prima.)

I seguenti due casi riguardano il 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 trovarsi nella directory root / src per il 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 file TestLoadProperties.class per il caricamento corretto.

Nota: TestLoadProperties.java e TestLoadProperties.class sono due file diversi. Il primo, .java , si trova di solito nella directory src / di un progetto, mentre il secondo, .class , si trova di solito in la sua directory bin / .

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();
    }

}
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());
        }

    }
}

Supponendo che tu stia utilizzando le Proprietà class, tramite la sua load e suppongo 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

Sono riuscito a risolvere questo problema con questa chiamata

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

In più, devi mettere il tuo whatever.properties in / src / main / resources

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

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

Godetevi

usa il codice qui sotto per favore:     

    Properties p = new Properties(); 
    StringBuffer path = new StringBuffer("com/al/common/email/templates/");
    path.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(); } }
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top