Javaでのプロパティファイルの読み取り


105

プロパティファイルを読み取ろうとする次のコードがあります。

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

最終行で例外が発生します。具体的には:

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)

おかげで、ニコス

回答:


89

例外に基づいて、InputStreamはnullです。これは、クラスローダーがプロパティファイルを見つけられないことを意味します。myProp.propertiesがプロジェクトのルートにあると思います。その場合は、前にスラッシュが必要です。

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

私のファイル階層は次のとおりです:src-> myPackage-> myClass.java、myProp.properties。私はあなたが私にアドバイスしたことをしましたが、それでも同じ例外が発生します
nikos

getResourceAsStreamクラスパスでファイルを検索します。プロパティファイルがのパッケージディレクトリにあるmyPackage場合/myPackage/myProp.propertiesは、パスとして使用します。
Jesper

2
@Mark Elliot confすべての構成ファイルを保存するパッケージがあり、ファイル階層が次のmyproject ->src, conf, test場合はどうなりますか?、前にスラッシュを追加してプロパティを読み込むにはどうすればよいですか?
ロジャーレイ

54


このページで情報を見つけることができます: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
閉じることを忘れないでくださいReader中のprop.load(reader)ドキュメントによると、:The specified stream remains open after this method returns
Evandroシルバ

25

ResourceBundleクラスを使用してプロパティファイルを読み取ることができます。

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

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

2
このアプローチはi18nに推奨されます。
他の

15
Properties prop = new Properties();

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

conf/filename.properties プロジェクトルートディレクトリに基づく


7

次のようにこのキーワードを使用することはできません-

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

静的なコンテキストで。

最善のことは、次のようなアプリケーションコンテキストを取得することです。

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

次に、クラスパスからリソースファイルをロードできます-

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

これは静的と非静的の両方のコンテキストで機能し、最も良い部分は、このプロパティファイルがアプリケーションのクラスパスに含まれている任意のパッケージ/フォルダーにあることです。


4
ApplicationContextは、Springアプリケーションの場合にのみ使用できます
joro

6

ファイルはcom/example/foo/myProps.propertiesクラスパスのように使用できる必要があります。次に、次のようにロードします。

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

4

config.propertiesがsrc / main / resourceディレクトリになく、プロジェクトのルートディレクトリにある場合は、以下のようにする必要があります。

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

3

ファイル名が正しいこと、およびファイルが実際にクラスパスにあることを確認してください。 getResourceAsStream()そうでない場合はnullを返し、最後の行で例外がスローされます。

myProp.propertiesがプロジェクトのルートディレクトリにある場合は、/myProp.properties代わりに使用してください。


私のファイル階層は次のとおりです:src-> myPackage-> myClass.java、myProp.properties。私はあなたが私に助言したことをしましたが、それでも同じ例外が発生します
nikos

プロパティファイルはプロジェクトのルートにないため、先頭のスラッシュは必要ありません。
MORT

最初にスラッシュなしで例外がスローされていました。まだ機能していません。
ニコス

3

次に示すように、java.io.InputStreamを使用してファイルを読み取ることができます。

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

JavaでInputStreamをファイルに変換する方法は?私は、File APIを使用しての.propertiesファイルを読みたかった

3

与えられたコンテキストloader.getResourceAsStream("myPackage/myProp.properties")を使用する必要があります。

リーディング'/'ClassLoader.getResourceAsStream(String)メソッドでは機能しません。

あるいは、パスをクラスの場所に対して絶対か相対かを決定するために使用するClass.getResourceAsStream(String)メソッドを使用'/'することもできます。

例:

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

2

プロパティファイルのパスとJavaクラスパスが同じ場合は、これを行う必要があります。

例えば:

src / myPackage / MyClass.java

src / myPackage / MyFile.properties

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

2

現在の回答はどれInputStreamも閉じられていることを示しておらず(これによりファイル記述子がリークします)、.getResourceAsStream()リソースが見つからない場合にnull を返すことに対処していません(これNullPointerExceptionにより、混乱を招くメッセージが表示されます"inStream parameter is null")。次のようなものが必要です。

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

元の順序でプロパティファイルを読み取る場合:

    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

ここでの多くの回答は、ファイル入力ストリームをインスタンス化するが、後でストリームを閉じるために入力ストリームへの参照を取得しない危険なメソッドについて説明しています。これにより、入力ストリームがぶら下がり、メモリリークが発生します。プロパティをロードする正しい方法は、次のようになります。

    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-resourcesブロック内のファイル入力ストリームのインスタンス化に注意してください。以来FileInputStreamautocloseableされた後、それが自動的に閉じられますtry-with-resourcesブロックが終了します。単純なtryブロックを使用する場合fis.close();は、finallyブロックで使用して明示的に閉じる必要があります。


0

質問は古いものだと思います。将来誰かがこれに遭遇した場合、これはそれを行う簡単な方法の1つだと思います。プロパティファイルをプロジェクトフォルダに保存します。

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

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

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