プロパティファイルを読み込もうとしている次のコードがあります。
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
あなたの例外に基づいて、InputStream
はnullです、これはクラスローダーがあなたのプロパティファイルを見つけていないことを意味します。 myProp.propertiesがプロジェクトのルートにあると思います。その場合は、スラッシュが必要です。
InputStream stream = loader.getResourceAsStream("/myProp.properties");
このページに情報があります。
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();
}
プロパティファイルを読み込むためにResourceBundle
クラスを使用できます。
ResourceBundle rb = ResourceBundle.getBundle("myProp.properties");
Properties prop = new Properties();
try {
prop.load(new FileInputStream("conf/filename.properties"));
} catch (IOException e) {
e.printStackTrace();
}
プロジェクトルートディレクトリのconf/filename.properties
ベース
あなたは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"));
これは静的コンテキストと非静的コンテキストの両方で機能します。最適なのは、このプロパティファイルがアプリケーションのクラスパスに含まれる任意のパッケージ/フォルダにあることです。
あなたのファイルはクラスパスでcom/example/foo/myProps.properties
として利用可能であるべきです。それからそれをロードする:
props.load(this.getClass().getResourceAsStream("myProps.properties"));
コンテキストloader.getResourceAsStream("myPackage/myProp.properties")
が使用されるべきであると仮定すると。
先頭の'/'
はClassLoader.getResourceAsStream(String)
メソッドでは動作しません。
別の方法として、Class.getResourceAsStream(String)
メソッドを使用することもできます。このメソッドは、パスが絶対パスであるか、それともクラスの場所からの相対パスであるかを判断するために'/'
を使用します。
例:
myClass.class.getResourceAsStream("myProp.properties")
myClass.class.getResourceAsStream("/myPackage/myProp.properties")
次に示すように、Java.io.InputStreamを使用してファイルを読み取ることができます。
InputStream inputStream = getClass().getClassLoader().getResourceAsStream(myProps.properties);
ファイル名が正しいこと、およびファイルが実際にクラスパスにあることを確認してください。そうでない場合、getResourceAsStream()
はnullを返します。そうでない場合、最後の行で例外がスローされます。
MyProp.propertiesがプロジェクトのルートディレクトリにある場合は、代わりに/myProp.properties
を使用してください。
元の順序でプロパティファイルを読み込む場合:
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>");
}
現在の答えはどれも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);
}
ここでの多くの回答は、ファイル入力ストリームをインスタンス化しますが、後でストリームを閉じるために入力ストリームへの参照を取得しないという危険な方法を説明しています。これにより、入力ストリームがぶら下がってメモリリークが発生します。プロパティをロードする正しい方法は、次のようになります。
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();
を使用して明示的に閉じる必要があります。
あなたのconfig.propertiesがsrc/main/resourceディレクトリになく、それがプロジェクトのルートディレクトリにあるなら、あなたは以下のような何かをする必要があります: -
Properties prop = new Properties();
File configFile = new File(myProp.properties);
InputStream stream = new FileInputStream(configFile);
prop.load(stream);
あなたのプロパティファイルのパスとあなたのJavaクラスパスが同じであれば、あなたはこれをするべきです。
例:
src/myPackage/MyClass.Java
src/myPackage/MyFile.properties
Properties prop = new Properties();
InputStream stream = MyClass.class.getResourceAsStream("MyFile.properties");
prop.load(stream);