web-dev-qa-db-ja.com

Javaパッケージからプロパティファイルをロードする

com.al.common.email.templatesのパッケージ構造に埋め込まれているプロパティファイルを読み取る必要があります。

私はすべてを試してみましたが、理解できません。

最終的に、私のコードはサーブレットコンテナーで実行されますが、コンテナーに依存することはしたくありません。 JUnitテストケースを作成し、両方で動作する必要があります。

108
SacramentoJoe

パッケージcom.al.common.email.templatesのクラスからプロパティをロードするとき、使用できます

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

(必要なすべての例外処理を追加します)。

クラスがそのパッケージにない場合、InputStreamをわずかに異なる方法で取得する必要があります。

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

getResource()/getResourceAsStream()の相対パス(先頭に「/」がないもの)は、クラスが含まれるパッケージを表すディレクトリに対してリソースが検索されることを意味します。

Java.lang.String.class.getResource("foo.txt")を使用すると、クラスパスで(存在しない)ファイル/Java/lang/String/foo.txtが検索されます。

絶対パス(「/」で始まるパス)を使用すると、現在のパッケージが無視されます。

230
Joachim Sauer

Joachim Sauerの答えに加えて、静的なコンテキストでこれを行う必要がある場合、次のようなことができます。

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

(例外処理は以前のように省略されました。)

48
cobra libre

次の2つのケースは、TestLoadPropertiesという名前のサンプルクラスからのプロパティファイルのロードに関連しています。

ケース1:ClassLoaderを使用してプロパティファイルをロードする

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

この場合、正常にロードするには、プロパティファイルがroot/srcディレクトリにある必要があります。

ケース2:ClassLoaderを使用せずにプロパティファイルを読み込む

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

この場合、正常にロードするには、プロパティファイルはTestLoadProperties.classファイルと同じディレクトリになければなりません。

注:TestLoadProperties.JavaTestLoadProperties.classは2つの異なるファイルです。前者の.Javaファイルは通常プロジェクトのsrc/ディレクトリにあり、後者の.classファイルは通常そのbin/ディレクトリにあります。

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

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

    }
}
8
Vicky

load メソッドを介して Properties クラスを使用し、入力ストリームを取得するためにClassLoader getResourceAsStream を使用していると思います。

名前をどのように渡しているのですか、それはこの形式である必要があります:/com/al/common/email/templates/foo.properties

2
Chris Kimpton

クラスのパッケージを扱う必要のない、上記よりもさらにシンプルなソリューションについて言及している人はいません。 myfile.propertiesがクラスパスにあると仮定します。

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

楽しい

1
isaac.hazan

私はこの呼び出しでこの問題を解決することができました

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

さらに、whatever.propertiesファイルを/ src/main/resourcesに配置する必要があります

1
Naramsim