web-dev-qa-db-ja.com

Javaでプロパティファイルを読む

プロパティファイルを読み込もうとしている次のコードがあります。

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)

ありがとう、Nikos

97
nikos

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

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


このページに情報があります。
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();
}
51
Steven Gomez

プロパティファイルを読み込むためにResourceBundleクラスを使用できます。

ResourceBundle rb = ResourceBundle.getBundle("myProp.properties");
23
dku.rajkumar
Properties prop = new Properties();

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

プロジェクトルートディレクトリのconf/filename.propertiesベース

9
tienya

あなたはthisキーワードを使うことはできません -

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

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

7
Mukus

あなたのファイルはクラスパスでcom/example/foo/myProps.propertiesとして利用可能であるべきです。それからそれをロードする:

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

コンテキストloader.getResourceAsStream("myPackage/myProp.properties")が使用されるべきであると仮定すると。

先頭の'/'ClassLoader.getResourceAsStream(String)メソッドでは動作しません。

別の方法として、Class.getResourceAsStream(String)メソッドを使用することもできます。このメソッドは、パスが絶対パスであるか、それともクラスの場所からの相対パスであるかを判断するために'/'を使用します。

例:

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

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

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

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

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

3
mort

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

    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
Walk

現在の答えはどれもInputStreamが閉じられていることを示している(これはファイルディスクリプタをリークする)、あるいはリソースが見つからないときにnullを返す.getResourceAsStream()を扱わない(これは混乱を招くメッセージ"inStream parameter is null"を伴うNullPointerExceptionにつながる) 。次のようなものが必要です。

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
Luke Hutchison

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

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

0
VHS

あなたのconfig.propertiesがsrc/main/resourceディレクトリになく、それがプロジェクトのルートディレクトリにあるなら、あなたは以下のような何かをする必要があります: -

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

あなたのプロパティファイルのパスとあなたのJavaクラスパスが同じであれば、あなたはこれをするべきです。

例:

src/myPackage/MyClass.Java

src/myPackage/MyFile.properties

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