Java özellik dosyaları nasıl kullanılır?


219

Java özellik dosyaları olarak saklamak ve daha sonra yüklemek ve yineleme yapmak istediğiniz yapılandırma değerlerinin anahtar / değer çiftlerinin bir listesi var.

Sorular:

  • Dosyayı yükleyecek sınıfla aynı pakette saklamam gerekiyor mu yoksa yerleştirilmesi gereken belirli bir konum var mı?
  • Dosyanın herhangi bir uzantıyla bitmesi gerekiyor mu yoksa .txtsorun yok mu?
  • Dosyayı koda nasıl yükleyebilirim
  • Ve içindeki değerleri nasıl yineleyebilirim?

Yanıtlar:


246

Bir InputStream özelliğini Mülke iletebilirsiniz, böylece dosyanız hemen hemen her yerde olabilir ve herhangi bir şey olarak adlandırılabilir.

Properties properties = new Properties();
try {
  properties.load(new FileInputStream("path/filename"));
} catch (IOException e) {
  ...
}

Şu şekilde tekrarlayın:

for(String key : properties.stringPropertyNames()) {
  String value = properties.getProperty(key);
  System.out.println(key + " => " + value);
}

Anahtar özellikler dosyasında bulunmadığında hangi değer döndürülür?
Mitaksh Gupta

2
@MitakshGupta Aktardığınız ada sahip bir özellik dosyada veya varsayılan özellikler listesinde bulunmazsa, tekrarlanır null. Bakınız Javadoc
drigoangelo

3
bu nasıl karşılaştırıldığında ne properties.load(PropertiesReader.class.getResourceAsStream("/properties.properties")); yani, getResourceAsStreamkarşı FileInputStream? lehte ve aleyhte olanlar?
Thufir

80
  • Sen olabilir sizin gibi dosya hiçbir yerinde saklayın. Eğer jar dosyanızda tutmak istiyorsanız, kullanmak Class.getResourceAsStream()veya ClassLoader.getResourceAsStream()erişmek istersiniz . Dosya sisteminde ise biraz daha kolaydır.

  • Herhangi bir uzantı gayet iyi, ancak .properties deneyimimde daha yaygın

  • Kullanarak dosyayı yükleyin Properties.loadbir ileterek InputStreamveya StreamReaderJava 6. kullanıyorsanız eğer varsa ( edilmektedir Java 6 kullanarak, muhtemelen UTF-8 ve kullanırsınız Readerakışı için varsayılan yerine ISO-8859-1 kodlama. )

  • Normal bir Hashtable( Propertiesörneğin, türetme) aracılığıyla yinelediğiniz gibi yineleyin keySet(). Alternatif olarak, tarafından döndürülen numaralandırmayı kullanabilirsiniz propertyNames().


1
Teţekkürler Jon, bildiđim bir sonraki ţey joda'da birţey arayacađým ve sen de buna cevap vereceksin.
Alev

27

Properties dosyasını Foo sınıfıyla aynı pakete koyarsanız, dosyayı kolayca yükleyebilirsiniz.

new Properties().load(Foo.class.getResourceAsStream("file.properties"))

Özelliklerin Hashtable'ı genişlettiği göz önüne alındığında, değerleri Hashhtable'daki gibi yineleyebilirsiniz.

* .Properties uzantısını kullanırsanız editör desteği alabilirsiniz, örneğin Eclipse bir özellikler dosyası düzenleyicisine sahiptir.


5
Bunu yapabilirsiniz - ama aynı pakette özellikler dosyaları depolamak sevmiyorum. Uygulamanızdaki her yere yayılmış özellik dosyaları ile sonuçlanırsınız. Tüm özellikler dosyalarını uygulamanın kökünde depolamak ve bunları "class.getResourceAsStream (" \ file.properties ")" veya bilinen başka bir konuma yüklemek istiyorum.
Nate

Nate, bu doğru. Ancak, bazı senaryolarda konuşlandırılan konum bilinmemektedir (örneğin, belirli bileşeninizin her şeyi bir arşive paketlenmiştir). Bu gibi durumlarda, 'sınıfın bittiği her yerde o sınıfla beraber' demek oldukça uygun olabilir. Ayrıca dosyaların her tarafa yayılmasını önlemek için, tüm özellik dosyaları için tek bir yapılandırma paketi kullanılabilir.
Fabian Steeg

1
Fabian, her iki durumda da dosya sistemiyle değil benim yorumumla çalışıyor.
Nate

2
Nate'in örneğini işe almaya çalışan herkes için ters eğik çizgi, eğik çizgi ile değiştirilmelidir. Bu durumda: 'class.getResourceAsStream ("/ file.properties")'
hash_collision

12

propertiesDosya oluşturmanın ve okumanın birçok yolu vardır :

  1. Dosyayı aynı pakette saklayın.
  2. Tavsiye .propertieskendi seçebilir ancak uzantısı.
  3. Kullanım bulunan sınıfları tezleri java.utilpaketin => Properties, ListResourceBundle, ResourceBundlesınıflar.
  4. Özellikleri okumak için yineleyici veya numaralandırıcı veya doğrudan Propertiesveya java.lang.Systemsınıf yöntemlerini kullanın .

ResourceBundle sınıf:

 ResourceBundle rb = ResourceBundle.getBundle("prop"); // prop.properties
 System.out.println(rb.getString("key"));

Properties sınıf:

Properties ps = new Properties();
ps.Load(new java.io.FileInputStream("my.properties"));

Merhaba AVD, neden .propertiessadece uzantıya ihtiyacımız var ? '.txt' uzantısıyla ilgili sorun nedir? lütfen bana yardım et.
atish shimpi

@atishshimpi Özellikleri türüyle çalışırken gerekli ama ResourceBundle için zorunludur Değil - onaylanması zorunludur okundu docs.oracle.com/javase/8/docs/api/java/util/ResourceBundle.html
adatapost

5

Bu özellikler dosyasını yükler:

Properties prop = new Properties();
InputStream stream = ...; //the stream to the file
try {
  prop.load(stream);
} finally {
  stream.close();
}

.Properties dosyasını tüm yapılandırma dosyalarına sahip olduğum bir dizine koymak için kullanıyorum, ona erişen sınıfla birlikte koymuyorum, ancak burada herhangi bir kısıtlama yok.

İsim için ... ayrıntı için uğruna .properties kullanıyorum, eğer istemiyorsanız .properties olarak adlandırmanız gerektiğini sanmıyorum.


Ancak, özellik dosyalarının bazı "uzantıları" .properties uzantısını varsayar; örneğin, I18N'de kullanılan ResourceBundle.
Nate

5

Misal:

Properties pro = new Properties();
FileInputStream in = new FileInputStream("D:/prop/prop.properties");
pro.load(in);
String temp1[];
String temp2[];
// getting values from property file
String username = pro.getProperty("usernamev3");//key value in prop file 
String password = pro.getProperty("passwordv3");//eg. username="zub"
String delimiter = ",";                         //password="abc"
temp1=username.split(delimiter);
temp2=password.split(delimiter);

3 proprties dosyanız varsa ne olur?
Angelina

4

Mülkler miras oldu. Tercihler sınıfı Özellikler yerine tercih edilir.

Tercih verilerinin hiyerarşik bir koleksiyonundaki bir düğüm. Bu sınıf, uygulamaların kullanıcı ve sistem tercihi ve yapılandırma verilerini depolamasına ve almasına izin verir. Bu veriler kalıcı olarak uygulamaya bağlı bir destek deposunda saklanır. Tipik uygulamalar arasında düz dosyalar, işletim sistemine özgü kayıtlar, dizin sunucuları ve SQL veritabanları bulunur. Bu sınıftaki kullanıcının destek mağazasının ayrıntıları ile ilgilenmesi gerekmez.

Dize tabanlı anahtar / değer çiftleri olan özelliklerden farklı olarak, Preferencessınıfın Tercihler veri deposuna ilkel veri almak ve koymak için kullanılan çeşitli yöntemler vardır. Yalnızca aşağıdaki veri türlerini kullanabiliriz:

  1. sicim
  2. boole
  3. çift
  4. şamandıra
  5. int
  6. uzun
  7. bayt dizisi

Özellikler dosyasını yüklemek için, mutlak yol sağlayabilirsiniz Ya getResourceAsStream()da özellikler dosyası sınıf yolunuzda varsa kullanın .

package com.mypack.test;

import java.io.*;
import java.util.*;
import java.util.prefs.Preferences;

public class PreferencesExample {

    public static void main(String args[]) throws FileNotFoundException {
        Preferences ps = Preferences.userNodeForPackage(PreferencesExample.class);
        // Load file object
        File fileObj = new File("d:\\data.xml");
        try {
            FileInputStream fis = new FileInputStream(fileObj);
            ps.importPreferences(fis);
            System.out.println("Prefereces:"+ps);
            System.out.println("Get property1:"+ps.getInt("property1",10));

        } catch (Exception err) {
            err.printStackTrace();
        }
    }
}

xml dosyası:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE preferences SYSTEM 'http://java.sun.com/dtd/preferences.dtd'>
<preferences EXTERNAL_XML_VERSION="1.0">
<root type="user">
<map />
<node name="com">
  <map />
  <node name="mypack">
    <map />
    <node name="test">
      <map>
        <entry key="property1" value="80" />
        <entry key="property2" value="Red" />
      </map>
    </node>
  </node>
</node>
</root>
</preferences>

Tercihler iç mağazasına ilişkin bu makaleye bir göz atın


3

Sırayla:

  1. Dosyayı hemen hemen her yerde saklayabilirsiniz.
  2. uzatma gerekli değildir.
  3. Montecristo resimli bu nasıl yerleştirileceği. Bu iyi olmalı.
  4. propertyNames () , yinelemeniz için bir numaralandırma verir.

2. no extension is necessary, Lütfen bana bu ifade için herhangi bir referans verebilir misiniz. Bu konuda karışıklığım var.
atish shimpi

Özellikleri bir giriş akışı aracılığıyla yükleyebileceğinizi unutmayın. Bu gibi özellikler, bu giriş akışının nereden geldiğini bilmiyor (bir dosya? Bir soket?) Ve sonuç olarak bir adlandırma standardını uygulayamıyor
Brian Agnew

3

Varsayılan olarak, Java bunu uygulamanızın çalışma dizininde açar (bu davranış aslında kullanılan işletim sistemine bağlıdır). Dosya yüklemek için şunları yapın:

Properties props = new java.util.Properties();
FileInputStream fis new FileInputStream("myfile.txt");
props.load(fis)

Bu nedenle, özellik dosyası için herhangi bir dosya uzantısı kullanılabilir. Ek olarak, bir dosya kullanabileceğiniz sürece dosya her yerde de saklanabilir FileInputStream.

İlgili bir notta, modern bir çerçeve kullanıyorsanız, çerçeve bir özellik dosyasını açmanın ek yollarını sağlayabilir. Örneğin, Spring ClassPathResourcebir JAR dosyasının içinden bir paket adı kullanarak bir özellik dosyası yüklemek için a sağlar.

Özellikler arasında yineleme yapmak için, özellikler yüklendikten sonra java.util.Properties, propertyNames()yöntemi sunan nesnede saklanırlar .


3

Özellikler dosyasını okuma ve içeriğini yükleme Properties

String filename = "sample.properties";
Properties properties = new Properties();

input = this.getClass().getClassLoader().getResourceAsStream(filename);
properties.load(input);

Aşağıdakiler, Properties

    for (Entry<Object, Object> entry : properties.entrySet()) {

        System.out.println(entry.getKey() + " => " + entry.getValue());
    }

3

In Java 8 tüm özelliklerini almak için

public static Map<String, String> readPropertiesFile(String location) throws Exception {

    Map<String, String> properties = new HashMap<>();

    Properties props = new Properties();
    props.load(new FileInputStream(new File(location)));

    props.forEach((key, value) -> {
        properties.put(key.toString(), value.toString());
    });

    return properties;
}

2

1) Mülkiyet dosyanızı sınıf yolunda kullanmak iyidir, ancak projenin herhangi bir yerine yerleştirebilirsiniz.

Aşağıda sınıf yolundan özellik dosyasını nasıl yüklediğiniz ve tüm özellikleri nasıl okuduğunuz aşağıda açıklanmıştır.

Properties prop = new Properties();
InputStream input = null;

try {

    String filename = "path to property file";
    input = getClass().getClassLoader().getResourceAsStream(filename);
    if (input == null) {
        System.out.println("Sorry, unable to find " + filename);
        return;
    }

    prop.load(input);

    Enumeration<?> e = prop.propertyNames();
    while (e.hasMoreElements()) {
        String key = (String) e.nextElement();
        String value = prop.getProperty(key);
        System.out.println("Key : " + key + ", Value : " + value);
    }

} catch (IOException ex) {
    ex.printStackTrace();
} finally {
    if (input != null) {
        try {
            input.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

2) Özellik dosyalarının uzantısı .properties


1

İşte özellikler üzerinde tekrarlamak için başka bir yol:

Enumeration eProps = properties.propertyNames();
while (eProps.hasMoreElements()) { 
    String key = (String) eProps.nextElement(); 
    String value = properties.getProperty(key); 
    System.out.println(key + " => " + value); 
}

2
Tamamen üzgünüm. Zed'in cevabındaki kodu gözden geçirdim ve oldukça iyi çalışıyor ... O zamanlar ne düşündüğümü bilmiyorum ... Aslında çözümü benimkinden daha güzel, sanırım ...
dertoni

1

Geçen yıl için bu mülkiyet çerçevesi üzerine yazdım. Özellikleri yüklemek için birden çok yol sağlayacak ve bunları da güçlü bir şekilde yazacak.

Http://sourceforge.net/projects/jhpropertiestyp/ adresine bir göz atın

JHPropertiesTyped geliştiriciye güçlü bir şekilde yazılmış özellikler verecektir. Mevcut projelere kolayca entegre edilebilir. Mülk türleri için geniş bir seri tarafından yönetilir. Özellik G / Ç uygulamaları aracılığıyla özellikleri tek satırlık başlatma yeteneği verir. Geliştiriciye kendi özellik türleri ve özellik io'ları oluşturma yeteneği verir. Web demosu da mevcuttur, yukarıda gösterilen ekran görüntüleri. Ayrıca, kullanmayı tercih ederseniz, özellikleri yönetmek için bir web kullanıcı arabirimi için standart bir uygulamaya sahip olun.

Komple dokümantasyon, öğretici, javadoc, sss vb. Proje web sayfasında mevcuttur.


0

İşte hazır statik sınıf

import java.io.*;
import java.util.Properties;
public class Settings {
    public static String Get(String name,String defVal){
        File configFile = new File(Variables.SETTINGS_FILE);
        try {
            FileReader reader = new FileReader(configFile);
            Properties props = new Properties();
            props.load(reader);
            reader.close();
            return props.getProperty(name);
        } catch (FileNotFoundException ex) {
            // file does not exist
            logger.error(ex);
            return defVal;
        } catch (IOException ex) {
            // I/O error
            logger.error(ex);
            return defVal;
        } catch (Exception ex){
            logger.error(ex);
            return defVal;
        }
    }
    public static Integer Get(String name,Integer defVal){
        File configFile = new File(Variables.SETTINGS_FILE);
        try {
            FileReader reader = new FileReader(configFile);
            Properties props = new Properties();
            props.load(reader);
            reader.close();
            return Integer.valueOf(props.getProperty(name));
        } catch (FileNotFoundException ex) {
            // file does not exist
            logger.error(ex);
            return defVal;
        } catch (IOException ex) {
            // I/O error
            logger.error(ex);
            return defVal;
        } catch (Exception ex){
            logger.error(ex);
            return defVal;
        }
    }
    public static Boolean Get(String name,Boolean defVal){
        File configFile = new File(Variables.SETTINGS_FILE);
        try {
            FileReader reader = new FileReader(configFile);
            Properties props = new Properties();
            props.load(reader);
            reader.close();
            return Boolean.valueOf(props.getProperty(name));
        } catch (FileNotFoundException ex) {
            // file does not exist
            logger.error(ex);
            return defVal;
        } catch (IOException ex) {
            // I/O error
            logger.error(ex);
            return defVal;
        } catch (Exception ex){
            logger.error(ex);
            return defVal;
        }
    }
    public static void Set(String name, String value){
        File configFile = new File(Variables.SETTINGS_FILE);
        try {
            Properties props = new Properties();
            FileReader reader = new FileReader(configFile);
            props.load(reader);
            props.setProperty(name, value.toString());
            FileWriter writer = new FileWriter(configFile);
            props.store(writer, Variables.SETTINGS_COMMENT);
            writer.close();
        } catch (FileNotFoundException ex) {
            // file does not exist
            logger.error(ex);
        } catch (IOException ex) {
            // I/O error
            logger.error(ex);
        } catch (Exception ex){
            logger.error(ex);
        }
    }
    public static void Set(String name, Integer value){
        File configFile = new File(Variables.SETTINGS_FILE);
        try {
            Properties props = new Properties();
            FileReader reader = new FileReader(configFile);
            props.load(reader);
            props.setProperty(name, value.toString());
            FileWriter writer = new FileWriter(configFile);
            props.store(writer,Variables.SETTINGS_COMMENT);
            writer.close();
        } catch (FileNotFoundException ex) {
            // file does not exist
            logger.error(ex);
        } catch (IOException ex) {
            // I/O error
            logger.error(ex);
        } catch (Exception ex){
            logger.error(ex);
        }
    }
    public static void Set(String name, Boolean value){
        File configFile = new File(Variables.SETTINGS_FILE);
        try {
            Properties props = new Properties();
            FileReader reader = new FileReader(configFile);
            props.load(reader);
            props.setProperty(name, value.toString());
            FileWriter writer = new FileWriter(configFile);
            props.store(writer,Variables.SETTINGS_COMMENT);
            writer.close();
        } catch (FileNotFoundException ex) {
            // file does not exist
            logger.error(ex);
        } catch (IOException ex) {
            // I/O error
            logger.error(ex);
        } catch (Exception ex){
            logger.error(ex);
        }
    }
}

İşte örnek:

Settings.Set("valueName1","value");
String val1=Settings.Get("valueName1","value");
Settings.Set("valueName2",true);
Boolean val2=Settings.Get("valueName2",true);
Settings.Set("valueName3",100);
Integer val3=Settings.Get("valueName3",100);

0

Özellik dosyasını şu şekilde yükleyerek yükleyebilirsiniz:

InputStream is = new Test().getClass().getClassLoader().getResourceAsStream("app.properties");
        Properties props =  new Properties();
        props.load(is);

Ve sonra aşağıdaki gibi bir lambda ifadesi kullanarak haritayı tekrarlayabilirsiniz:

props.stringPropertyNames().forEach(key -> {
            System.out.println("Key is :"+key + " and Value is :"+props.getProperty(key));
        });

0

Bence bunu aşağıdaki gibi çok basit yapabildiğimizde diğer yollar kullanımdan kaldırılıyor:

@PropertySource("classpath:application.properties")
public class SomeClass{

    @Autowired
    private Environment env;

    public void readProperty() {
        env.getProperty("language");
    }

}

çok basit ama bence bu en iyi yol! Zevk almak

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.