Javaプロパティファイルの使用方法


219

Javaプロパティファイルとして保存し、後でロードして反復処理する構成値のキー/値ペアのリストがあります。

質問:

  • ファイルをロードするクラスと同じパッケージにファイルを保存する必要がありますか、それとも配置する必要がある特定の場所がありますか?
  • ファイルは特定の拡張子で終わる必要がありますか、それとも.txt問題ありませんか?
  • コードでファイルをロードするにはどうすればよいですか
  • そして、どうすれば内部の値を反復できますか?

回答:


245

InputStreamをプロパティに渡すことができるため、ファイルはほとんどどこにでも置くことができ、何でも呼び出すことができます。

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

次のように繰り返す:

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

プロパティファイルにキーが存在しない場合、どの値が返されますか?
Mitaksh Gupta 2014

2
@MitakshGupta渡した名前のプロパティがファイルまたはデフォルトのプロパティリストにない場合は、が返されnullます。Javadocを
drigoangelo 14

3
これはどのように比較しないproperties.load(PropertiesReader.class.getResourceAsStream("/properties.properties")); こと、であるgetResourceAsStreamFileInputStream?賛否両論?
Thufir、2015年

80
  • あなたは、することができますあなたが好きなファイルの任意の場所に保管してください。それをjarファイルに保持したい場合は、それを使用するClass.getResourceAsStream()ClassLoader.getResourceAsStream()アクセスします。ファイルシステム上にある場合は、少し簡単です。

  • 私の経験では.propertiesがより一般的ですが、任意の拡張子で結構です

  • Java 6を使用している場合Properties.loadは、InputStreamまたはを使用してファイルをロードしますStreamReader(Java 6を使用している場合Readerは、ストリームにデフォルトのISO-8859-1エンコーディングの代わりにUTF-8とaを使用します。 )

  • 通常のHashtable(それからProperties派生する)を反復するときと同じように、たとえばを使用して反復しkeySet()ます。または、から返される列挙を使用できますpropertyNames()


1
ジョンに感謝します。次のことは私がジョーダで何かを調べていることを知っているので、あなたもそれに答えます。
Flame

27

プロパティファイルをクラスFooと同じパッケージに入れれば、簡単にそれをロードできます

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

PropertiesがHashtableを拡張する場合、Hashtableの場合と同じ方法で値を反復できます。

* .properties拡張子を使用すると、エディターサポートを取得できます。たとえば、Eclipseにはプロパティファイルエディターがあります。


5
あなたはこれ行うことができます-私は同じパッケージにプロパティファイルを保存するのが嫌いです。プロパティファイルがアプリケーションのあちこちに散らばることになります。すべてのプロパティファイルをアプリのルートに保存し、それらを「class.getResourceAsStream( "\ file.properties")」としてロードするか、他の既知の場所にロードするほうがよいでしょう。
ネイト

ネイト、それは本当だ。ただし、一部のシナリオでは、展開された場所が不明です(たとえば、特定のコンポーネントのすべてが一部のアーカイブにバンドルされています)。そのような場合、「そのクラスが最終的にどこにあろうとも、それはそのクラスにある」と言うのが非常に便利です。また、ファイルが全体に広がるのを防ぐために、すべてのプロパティファイルに単一の構成パッケージを使用できます。
Fabian Steeg

1
ファビアン、どちらの場合も私のコメントで機能します-ファイルシステムではなくクラスパスに基づいています。
ネイト・

2
Nateの例を機能させようとする人は、円記号をスラッシュに置き換えてください。したがって、この場合: 'class.getResourceAsStream( "/ file.properties")'
hash_collision

12

propertiesファイルの作成と読み取りには多くの方法があります。

  1. ファイルを同じパッケージに保存します。
  2. オススメ .properties拡張をますが、自分で選択することもできます。
  3. 使用してに位置するクラス学位論文java.utilのパッケージを=> 、、PropertiesListResourceBundleResourceBundleクラス。
  4. プロパティを読み取るには、反復子または列挙子を使用するか、Propertiesまたはjava.lang.Systemクラスの直接メソッドを使用します。

ResourceBundle クラス:

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

Properties クラス:

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

こんにちはAVD、なぜ.properties拡張機能だけが必要なのですか?「.txt」拡張子の何が問題になっていますか?助けてください
atish shimpi 2014

@atishshimpiプロパティタイプでの作業中に必要ですが、それはResourceBundleのために必須ではありません- DOC-読みdocs.oracle.com/javase/8/docs/api/java/util/ResourceBundle.html
adatapost

5

これにより、プロパティファイルが読み込まれます。

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

私はすべての構成ファイルがあるディレクトリに.propertiesファイルを配置するために使用します。これにアクセスするクラスと一緒に配置しませんが、ここでの制限はありません。

名前について...冗長性のために.propertiesを使用していますが、必要ない場合は.propertiesと名前を付けるべきではないと思います。


ただし、プロパティファイルの一部の「拡張子」は、.properties拡張子を想定しています-たとえば、I18Nで使用されるResourceBundle。
ネイト

5

例:

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つのプロパティファイルがある場合はどうなりますか?
アンジェリーナ14

4

プロパティはレガシーになりました。PreferencesクラスはPropertiesよりも優先されます。

設定データの階層コレクション内のノード。このクラスを使用すると、アプリケーションはユーザーとシステムの設定および構成データを格納および取得できます。このデータは、実装に依存するバッキングストアに永続的に保存されます。典型的な実装には、フラットファイル、OS固有のレジストリ、ディレクトリサーバー、SQLデータベースが含まれます。このクラスのユーザーは、バッキングストアの詳細を気にする必要はありません。

Stringベースのキーと値のペアであるプロパティとは異なり、このPreferencesクラスには、Preferencesデータストアでプリミティブデータを取得および配置するために使用されるいくつかのメソッドがあります。次のタイプのデータのみを使用できます。

  1. ストリング
  2. ブール
  3. ダブル
  4. 浮く
  5. int
  6. 長いです
  7. バイト配列

プロパティファイルをロードするには、絶対パスを指定するgetResourceAsStream()か、プロパティファイルがクラスパスにある場合に使用します。

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ファイル:

<?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>

設定ストアの内部に関するこの記事をご覧ください


3

順番に:

  1. ファイルはどこにでも保存できます。
  2. 延長は必要ありません。
  3. モンテクリストはい示しますこれをロードする方法をしました。それはうまくいくはずです。
  4. propertyNames()は、反復する列挙を提供します。

2. no extension is necessary、この声明の参考資料を教えてください。私はそれについて混乱しています。
atish shimpi 2014

入力ストリームを介してプロパティをロードできることに注意してください。そのため、プロパティはその入力ストリームがどこから来たのか(ファイル?ソケット?)を認識していないため、命名基準を適用できません
Brian Agnew

3

デフォルトでは、Javaはアプリケーションの作業ディレクトリでそれを開きます(この動作は実際には使用するOSによって異なります)。ファイルをロードするには、次のようにします。

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

そのため、プロパティファイルには任意のファイル拡張子を使用できます。また、を使用できる限り、ファイルはどこにでも保存できますFileInputStream

関連するメモとして、最新のフレームワークを使用する場合、フレームワークはプロパティファイルを開く追加の方法を提供する場合があります。たとえば、SpringはClassPathResource、JARファイル内からパッケージ名を使用してプロパティファイルをロードするためにを提供しています。

プロパティの繰り返し処理については、プロパティが読み込まれるとjava.util.PropertiespropertyNames()メソッドを提供するオブジェクトに格納されます。


3

プロパティファイルの読み取りとその内容の読み込み Properties

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

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

以下は、反復する効率的な方法です Properties

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

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

3

Java 8のすべてのあなたの特性を取得します

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)プロパティファイルをクラスパスに置くのは良いことですが、プロジェクトのどこにでも置くことができます。

以下は、クラスパスからプロパティファイルを読み込み、すべてのプロパティを読み取る方法です。

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)プロパティファイルの拡張子は.propertiesです。


1

プロパティを反復処理する別の方法を次に示します。

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

2
すみません。私はZedの回答でコードを確認しましたが、それは非常にうまく機能します...当時何を考えていたのかわかりません...実際、彼の解決策は私のものより優れていると思います...
dertoni

1

昨年、このプロパティフレームワークについて書きました。プロパティをロードする複数の方法を提供し、それらも強く型付けされます。

見てhttp://sourceforge.net/projects/jhpropertiestyp/

JHPropertiesTypedは、厳密に型指定されたプロパティを開発者に提供します。既存のプロジェクトに簡単に統合できます。プロパティタイプの大規模なシリーズで処理されます。プロパティIO実装を介して1行でプロパティを初期化する機能を提供します。独自のプロパティタイプとプロパティIOを作成する機能を開発者に提供します。上記のスクリーンショットのWebデモも利用できます。プロパティを使用する場合は、プロパティを管理するためのWebフロントエンドの標準実装もあります。

完全なドキュメント、チュートリアル、javadoc、FAQなどは、プロジェクトのWebページで入手できます。


0

ここで準備ができた静的クラス

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

ここにサンプル:

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

次の方法でプロパティファイルをロードできます。

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

そして、次のようなラムダ式を使用してマップを反復できます。

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

0

私の意見では、以下のように非常に簡単に実行できる場合、他の方法は推奨されません。

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

    @Autowired
    private Environment env;

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

}

とてもシンプルですが、それが一番いい方法だと思います!! 楽しい

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.