Javaパッケージからのプロパティファイルの読み込み


115

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

私はすべてを試しました、そしてそれを理解することができません。

結局、私のコードはサーブレットコンテナーで実行されますが、コンテナーに何も依存したくありません。私はJUnitテストケースを書いており、両方で動作する必要があります。

回答:


235

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、クラスパスで(存在しない)ファイルが検索されます。

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


2
提案:相対パスを使用する場合と絶対パスを使用する場合の説明を追加します(先頭に「/」がある場合とない場合)。
アーロンディグラ2008

1
プロパティファイルがsrcディレクトリの外部にあるが、プロジェクトディレクターの内部にある場合はどうなりますか?
ジョナサン

1
@jonney:Java自体には「プロジェクトディレクトリ」の概念がありません。一部のIDEにはそれがあるかもしれません。ただし、Javaに関する限り、それはクラスパスとはまったく関係のない、ファイルシステム上のどこかのファイルです。
Joachim Sauer 2013

50

ヨアヒムザウアーの答えに追加するには、これを静的なコンテキストで行う必要がある場合は、次のようなことを行うことができます:

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

(以前と同様に、例外処理が省略されています。)


これは私のために働いた答えです。受け入れられた回答が得られませんでした。
スティーブHHH

1
@cobralibre プロジェクトのresourcesフォルダーにあるプロパティファイルを読み取る方法maven
Kasun Siyambalapitiya '27 / 04/27

16

次の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.javaおよびTestLoadProperties.classは2つの異なるファイルです。前者の.javaファイルは通常プロジェクトのsrc/ディレクトリにあり、後者の.classファイルは通常そのプロジェクトのディレクトリにありますbin/


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

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

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


1

私はこの電話でこの問題をなんとか解決しました

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

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


9
どこPropertiesUtilから来たの?
ベンワトソン

1

クラスのパッケージを処理する必要がなく、上記と同様の、しかしより簡単なソリューションについては誰も言及していません。myfile.propertiesがクラスパスにあると仮定します。

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

楽しい


-2

以下のコードを使用してください:

    プロパティp = 新しいプロパティ(); StringBuffer path = new StringBuffer "com / al / common / email / templates /" ); 
    パス追加"foo.properties" ); InputStream fs = getClass ()。getClassLoader ()getResourceAsStream パスのtoString ())。   
      
    
                                    

if(fs == null){ System.err.println("Unable to load the properties file"); } else{ try{ p.load(fs); } catch (IOException e) { e.printStackTrace(); } }
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.