Java paketinden bir özellikler dosyası yükleme


115

İçinde paket yapıma gömülü olan bir özellik dosyasını okumam gerekiyor com.al.common.email.templates.

Her şeyi denedim ve çözemiyorum.

Sonunda, kodum bir sunucu uygulaması kapsayıcısında çalışacak, ancak hiçbir şey için kapsayıcıya bağımlı olmak istemiyorum. JUnit test durumları yazıyorum ve her ikisinde de çalışması gerekiyor.

Yanıtlar:


235

Paketteki bir Sınıftan Özellikleri yüklerken com.al.common.email.templateskullanabilirsiniz

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

(Gerekli tüm istisna işlemlerini ekleyin).

Sınıfınız bu pakette değilse, InputStream'i biraz farklı şekilde edinmeniz gerekir:

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

Göreceli yollar (olmayanlar lider '/') 'de getResource()/ getResourceAsStream()ortalama kaynak sınıfı olan paket temsil dizine göre aranır edilecektir.

Kullanmak , sınıf yolunda java.lang.String.class.getResource("foo.txt")(var olmayan) dosyayı arar /java/lang/String/foo.txt.

Mutlak bir yol kullanmak ('/' ile başlayan), mevcut paketin göz ardı edildiği anlamına gelir.


2
Öneri: Ne zaman göreli ve mutlak yolların ne zaman kullanılacağına dair bir açıklama ekleyin (başında "/" ile ve olmadan).
Aaron Digulla

1
özellikler dosyanız src dizininin dışında, ancak yine de proje yöneticinizin içindeyse ne olur?
Jonathan

1
@jonney: Java'nın kendisi "proje dizini" kavramına sahip değildir, bazı IDE'ler buna sahip olabilir. Ancak Java söz konusu olduğunda, bu, sınıf yolu ile hiçbir ilgisi olmayan dosya sisteminde bir yerde bulunan bir dosyadır.
Joachim Sauer

50

Joachim Sauer'in cevabına eklemek için, bunu statik bir bağlamda yapmanız gerekirse, aşağıdakilere benzer bir şey yapabilirsiniz:

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

(Daha önce olduğu gibi istisna işleme tabi değildir.)


Benim için işe yarayan cevap bu. Kabul edilen cevabı işe alamadım.
Steve HHH

1
@cobralibre resourcesbir mavenprojede klasörde bulunan bir özellikler dosyası nasıl okunur
Kasun Siyambalapitiya

16

Aşağıdaki iki durum, adlı örnek bir sınıftan bir özellikler dosyasının yüklenmesiyle ilgilidir TestLoadProperties.

Durum 1: Özellikler dosyasını kullanarak yükleme ClassLoader

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

Bu durumda, root/srcbaşarılı bir yükleme için özellikler dosyası dizinde olmalıdır .

Durum 2: Özellikler dosyasını kullanmadan yükleme ClassLoader

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

Bu durumda, TestLoadProperties.classbaşarılı bir yükleme için özellikler dosyası dosya ile aynı dizinde olmalıdır .

Not: TestLoadProperties.java ve TestLoadProperties.classiki farklı dosyadır. İlki olan .javadosya genellikle bir projenin src/dizininde bulunurken, ikincisi .classdosya genellikle kendi bin/dizininde bulunur.


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

Yük yöntemi aracılığıyla Properties sınıfını kullandığınızı varsayarsak ve sanırım girdi akışını almak için ClassLoader getResourceAsStream kullanıyorsunuz .

İsmi nasıl geçiyorsun, görünüşe göre bu biçimde olmalı: /com/al/common/email/templates/foo.properties


1

Bu sorunu bu görüşmeyle çözmeyi başardım

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

Ek olarak, what.properties dosyanızı / src / main / resources dizinine koymalısınız.


9
Nerede alıyorsanız PropertiesUtilgelen?
Ben Watson

1

Hiç kimse sınıfın paketiyle uğraşmaya gerek kalmadan benzer ama hatta daha basit bir çözümden bahsetmiyor. Myfile.properties dosyasının sınıf yolunda olduğunu varsayarsak.

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

Zevk almak


-2

lütfen aşağıdaki kodu kullanın:

    Özellikler p = new Özellikler (); StringBuffer yolu = new StringBuffer ( "com / al / common / email / templates /" ); 
    yol . append ( "foo.properties" ); InputStream fs = getClass (). getClassLoader () . getResourceAsStream ( yol . toString ());   
      
    
                                    

if(fs == null){ System.err.println("Unable to load the properties file"); } else{ try{ p.load(fs); } catch (IOException e) { e.printStackTrace(); } }
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.