Java'da Özellikler dosyasını okuma


105

Özellikler dosyasını okumaya çalışırken aşağıdaki koda sahibim:

Properties prop = new Properties();
ClassLoader loader = Thread.currentThread().getContextClassLoader();           
InputStream stream = loader.getResourceAsStream("myProp.properties");
prop.load(stream);

Son satırda bir istisna var. Özellikle:

Exception in thread "main" java.lang.NullPointerException
at java.util.Properties$LineReader.readLine(Properties.java:418)
at java.util.Properties.load0(Properties.java:337)
at java.util.Properties.load(Properties.java:325)
at Assignment1.BaseStation.readPropertyFile(BaseStation.java:46)
at Assignment1.BaseStation.main(BaseStation.java:87)

teşekkürler, Nikos

Yanıtlar:


89

İstisnanıza bağlı olarak, InputStreamnull, bu, sınıf yükleyicinin özellikler dosyanızı bulamadığı anlamına gelir. MyProp.properties'in projenizin kökünde olduğunu tahmin ediyorum, bu durumda, önceki bir eğik çizgiye ihtiyacınız var:

InputStream stream = loader.getResourceAsStream("/myProp.properties");

dosya hiyerarşim: src -> paketim -> sınıfım.java, benimProp.properties. Bana tavsiye ettiğin şeyi yaptım ama yine de aynı istisnayı ortaya
çıkarıyor

getResourceAsStreamdosyayı sınıf yolunda arar. Özellikler dosyanız paket dizinindeyse , yol olarak myPackagekullanın /myPackage/myProp.properties.
Jesper

2
@Mark Elliot, conftüm yapılandırma dosyalarımı depolamak için bir paketim varsa ve dosya hiyerarşim ise:, myproject ->src, conf, testbir eğik çizgi ekleyerek özellikleri nasıl yükleyeceğim?
Roger Ray

54


Bu sayfada bilgi bulabilirsiniz:
http://www.mkyong.com/java/java-properties-file-examples/

Properties prop = new Properties();
try {
    //load a properties file from class path, inside static method
    prop.load(App.class.getClassLoader().getResourceAsStream("config.properties"));

    //get the property value and print it out
    System.out.println(prop.getProperty("database"));
    System.out.println(prop.getProperty("dbuser"));
    System.out.println(prop.getProperty("dbpassword"));

} 
catch (IOException ex) {
    ex.printStackTrace();
}

3
Belgelere göre Readergirişi kapatmayı unutmayın prop.load(reader):The specified stream remains open after this method returns
Evandro Silva

25

ResourceBundleÖzellikler dosyasını okumak için sınıfı kullanabilirsiniz .

ResourceBundle rb = ResourceBundle.getBundle("myProp.properties");

1
ResourceBundle rb = ResourceBundle.getBundle ("myProp");
mcolak

2
Bu yaklaşım i18n için önerilir .
başka bir

15
Properties prop = new Properties();

try {
    prop.load(new FileInputStream("conf/filename.properties"));
} catch (IOException e) {
    e.printStackTrace();
}

conf/filename.properties proje kök dizinine dayalı


7

Sen kullanamazsınız Bu gibi anahtar kelimeyi -

props.load(this.getClass().getResourceAsStream("myProps.properties"));

statik bir bağlamda.

En iyi şey, uygulama bağlamını şu şekilde elde etmektir:

ApplicationContext context = new ClassPathXmlApplicationContext("classpath:/META-INF/spring/app-context.xml");

daha sonra kaynak dosyasını sınıf yolundan yükleyebilirsiniz -

//load a properties file from class path, inside static method
        prop.load(context.getClassLoader().getResourceAsStream("config.properties"));

Bu, hem statik hem de statik olmayan bağlam için çalışacaktır ve en iyi bölüm, bu özellikler dosyasının uygulamanın sınıf yolunda bulunan herhangi bir paket / klasörde olabilmesidir.


4
ApplicationContext yalnızca Bahar başvurusu durumunda kullanılabilir
joro

6

Dosyanız com/example/foo/myProps.propertiessınıf yolunda olduğu gibi mevcut olmalıdır . Ardından şu şekilde yükleyin:

props.load(this.getClass().getResourceAsStream("myProps.properties"));

4

config.properties'iniz src / main / resource dizininde değilse ve projenin kök dizinindeyse, aşağıdaki gibi bir şey yapmanız gerekir: -

Properties prop = new Properties();          
File configFile = new File(myProp.properties);
InputStream stream = new FileInputStream(configFile);
prop.load(stream);

3

Dosya adının doğru olduğundan ve dosyanın aslında sınıf yolunda olduğundan emin olun. getResourceAsStream()son satırın istisna atmasına neden olan durum bu değilse null döndürür.

MyProp.properties, projenizin kök dizinindeyse, /myProp.propertiesbunun yerine kullanın.


dosya hiyerarşim: src -> paketim -> sınıfım.java, benimProp.properties. Bana tavsiye ettiğin şeyi yaptım ama yine de aynı istisnayı ortaya
çıkarıyor

Özellikler dosyanız projenizin kökünde olmadığından, baştaki eğik çizgiye ihtiyacınız yoktur.
mort

Baştaki eğik çizgi olmadan ilk etapta istisnayı alıyordum. Hala çalışmıyor.
nikos

3

Dosyayı aşağıda gösterildiği gibi okumak için java.io.InputStream'i kullanabilirsiniz:

InputStream inputStream = getClass().getClassLoader().getResourceAsStream(myProps.properties); 

InputStream'i Java'da Dosyaya Dönüştürme

3

Bağlam göz önüne alındığında loader.getResourceAsStream("myPackage/myProp.properties")kullanılmalıdır.

Liderlik yöntemle '/'çalışmaz ClassLoader.getResourceAsStream(String).

Alternatif olarak , yolun mutlak mı yoksa sınıf konumuna göre mi olduğunu belirlemek için Class.getResourceAsStream(String)kullanan yöntemi kullanabilirsiniz '/'.

Örnekler:

myClass.class.getResourceAsStream("myProp.properties")
myClass.class.getResourceAsStream("/myPackage/myProp.properties")

2

Özellikler dosya yolunuz ve java sınıf yolunuz aynıysa, bunu yapmalısınız.

Örneğin:

src / myPackage / Sınıfım.java

src / myPackage / MyFile.properties

Properties prop = new Properties();
InputStream stream = MyClass.class.getResourceAsStream("MyFile.properties");
prop.load(stream);

2

Mevcut yanıtların hiçbiri InputStreamkapatıldığını göstermez (bu, bir dosya tanımlayıcısını sızdırır) ve / veya .getResourceAsStream()kaynak bulunamadığında boş döndürme ile uğraşmaz (bu NullPointerException, kafa karıştırıcı bir mesaja yol açar "inStream parameter is null"). Aşağıdakine benzer bir şeye ihtiyacınız var:

String propertiesFilename = "server.properties";
Properties prop = new Properties();
try (var inputStream = getClass().getClassLoader().getResourceAsStream(propertiesFilename)) {
    if (inputStream == null) {
        throw new FileNotFoundException(propertiesFilename);
    }
    prop.load(inputStream);
} catch (IOException e) {
    throw new RuntimeException(
                "Could not read " + propertiesFilename + " resource file: " + e);
}

1

Özellikler dosyasını orijinal sırasıyla okumak için:

    File file = new File("../config/edc.properties");
    PropertiesConfiguration config = new PropertiesConfiguration();
    PropertiesConfigurationLayout layout = new PropertiesConfigurationLayout(config);
    layout.load(new InputStreamReader(new FileInputStream(file)));

    for(Object propKey : layout.getKeys()){
        PropertiesConfiguration propval =  layout.getConfiguration();
        String value = propval.getProperty((String) propKey).toString();
        out.print("Current Key:" + propkey + "Current Value:" + propval + "<br>");
    }

1

Buradaki birçok cevap, bir dosya giriş akışını başlattıkları ancak akışı daha sonra kapatmak için giriş akışına bir referans almadıkları tehlikeli yöntemleri açıklar. Bu, giriş akışlarının sarkmasına ve bellek sızıntılarına neden olur. Özellikleri yüklemenin doğru yolu aşağıdakine benzer olmalıdır:

    Properties prop = new Properties();
    try(InputStream fis = new FileInputStream("myProp.properties")) {
        prop.load(fis);
    }
    catch(Exception e) {
        System.out.println("Unable to find the specified properties file");
        e.printStackTrace();
        return;
    }

try-with-resourcesBlok halinde dosya giriş akışının somutlaştırılmasına dikkat edin . A FileInputStreamotomatik olarak kapatılabilir olduğundan, try-with-resourcesbloktan çıkıldıktan sonra otomatik olarak kapatılacaktır . Basit kullanmak istiyorsanız trybloğu, açıkça kullanarak kapatmalısınız fis.close();içinde finallybloğun.


1

Sorunun eski bir soru olduğunu görüyorum. Gelecekte buna rastlayan biri olursa, bunun bunu yapmanın basit bir yolu olduğunu düşünüyorum. Özellikler dosyasını proje klasörünüzde tutun.

        FileReader reader = new FileReader("Config.properties");

        Properties prop = new Properties();
        prop.load(reader);

-1

Src'den başlayarak yolu aşağıdaki gibi belirtin:

src/main/resources/myprop.proper
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.