Javaプロパティファイルとして保存し、後でロードして反復処理する構成値のキー/値ペアのリストがあります。
質問:
- ファイルをロードするクラスと同じパッケージにファイルを保存する必要がありますか、それとも配置する必要がある特定の場所がありますか?
- ファイルは特定の拡張子で終わる必要がありますか、それとも
.txt
問題ありませんか? - コードでファイルをロードするにはどうすればよいですか
- そして、どうすれば内部の値を反復できますか?
Javaプロパティファイルとして保存し、後でロードして反復処理する構成値のキー/値ペアのリストがあります。
質問:
.txt
問題ありませんか?回答:
InputStreamをプロパティに渡すことができるため、ファイルはほとんどどこにでも置くことができ、何でも呼び出すことができます。
Properties properties = new Properties();
try {
properties.load(new FileInputStream("path/filename"));
} catch (IOException e) {
...
}
次のように繰り返す:
for(String key : properties.stringPropertyNames()) {
String value = properties.getProperty(key);
System.out.println(key + " => " + value);
}
null
ます。Javadocを
properties.load(PropertiesReader.class.getResourceAsStream("/properties.properties"));
こと、であるgetResourceAsStream
対FileInputStream
?賛否両論?
あなたは、することができますあなたが好きなファイルの任意の場所に保管してください。それをjarファイルに保持したい場合は、それを使用するClass.getResourceAsStream()
かClassLoader.getResourceAsStream()
アクセスします。ファイルシステム上にある場合は、少し簡単です。
私の経験では.propertiesがより一般的ですが、任意の拡張子で結構です
Java 6を使用している場合Properties.load
は、InputStream
またはを使用してファイルをロードしますStreamReader
(Java 6を使用している場合Reader
は、ストリームにデフォルトのISO-8859-1エンコーディングの代わりにUTF-8とaを使用します。 )
通常のHashtable
(それからProperties
派生する)を反復するときと同じように、たとえばを使用して反復しkeySet()
ます。または、から返される列挙を使用できますpropertyNames()
。
プロパティファイルをクラスFooと同じパッケージに入れれば、簡単にそれをロードできます
new Properties().load(Foo.class.getResourceAsStream("file.properties"))
PropertiesがHashtableを拡張する場合、Hashtableの場合と同じ方法で値を反復できます。
* .properties拡張子を使用すると、エディターサポートを取得できます。たとえば、Eclipseにはプロパティファイルエディターがあります。
properties
ファイルの作成と読み取りには多くの方法があります。
.properties
拡張をますが、自分で選択することもできます。java.util
のパッケージを=> 、、Properties
ListResourceBundle
ResourceBundle
クラス。Properties
またはjava.lang.System
クラスの直接メソッドを使用します。ResourceBundle
クラス:
ResourceBundle rb = ResourceBundle.getBundle("prop"); // prop.properties
System.out.println(rb.getString("key"));
Properties
クラス:
Properties ps = new Properties();
ps.Load(new java.io.FileInputStream("my.properties"));
.properties
拡張機能だけが必要なのですか?「.txt」拡張子の何が問題になっていますか?助けてください
これにより、プロパティファイルが読み込まれます。
Properties prop = new Properties();
InputStream stream = ...; //the stream to the file
try {
prop.load(stream);
} finally {
stream.close();
}
私はすべての構成ファイルがあるディレクトリに.propertiesファイルを配置するために使用します。これにアクセスするクラスと一緒に配置しませんが、ここでの制限はありません。
名前について...冗長性のために.propertiesを使用していますが、必要ない場合は.propertiesと名前を付けるべきではないと思います。
例:
Properties pro = new Properties();
FileInputStream in = new FileInputStream("D:/prop/prop.properties");
pro.load(in);
String temp1[];
String temp2[];
// getting values from property file
String username = pro.getProperty("usernamev3");//key value in prop file
String password = pro.getProperty("passwordv3");//eg. username="zub"
String delimiter = ","; //password="abc"
temp1=username.split(delimiter);
temp2=password.split(delimiter);
プロパティはレガシーになりました。PreferencesクラスはPropertiesよりも優先されます。
設定データの階層コレクション内のノード。このクラスを使用すると、アプリケーションはユーザーとシステムの設定および構成データを格納および取得できます。このデータは、実装に依存するバッキングストアに永続的に保存されます。典型的な実装には、フラットファイル、OS固有のレジストリ、ディレクトリサーバー、SQLデータベースが含まれます。このクラスのユーザーは、バッキングストアの詳細を気にする必要はありません。
Stringベースのキーと値のペアであるプロパティとは異なり、このPreferences
クラスには、Preferencesデータストアでプリミティブデータを取得および配置するために使用されるいくつかのメソッドがあります。次のタイプのデータのみを使用できます。
プロパティファイルをロードするには、絶対パスを指定するgetResourceAsStream()
か、プロパティファイルがクラスパスにある場合に使用します。
package com.mypack.test;
import java.io.*;
import java.util.*;
import java.util.prefs.Preferences;
public class PreferencesExample {
public static void main(String args[]) throws FileNotFoundException {
Preferences ps = Preferences.userNodeForPackage(PreferencesExample.class);
// Load file object
File fileObj = new File("d:\\data.xml");
try {
FileInputStream fis = new FileInputStream(fileObj);
ps.importPreferences(fis);
System.out.println("Prefereces:"+ps);
System.out.println("Get property1:"+ps.getInt("property1",10));
} catch (Exception err) {
err.printStackTrace();
}
}
}
xmlファイル:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE preferences SYSTEM 'http://java.sun.com/dtd/preferences.dtd'>
<preferences EXTERNAL_XML_VERSION="1.0">
<root type="user">
<map />
<node name="com">
<map />
<node name="mypack">
<map />
<node name="test">
<map>
<entry key="property1" value="80" />
<entry key="property2" value="Red" />
</map>
</node>
</node>
</node>
</root>
</preferences>
順番に:
2. no extension is necessary
、この声明の参考資料を教えてください。私はそれについて混乱しています。
デフォルトでは、Javaはアプリケーションの作業ディレクトリでそれを開きます(この動作は実際には使用するOSによって異なります)。ファイルをロードするには、次のようにします。
Properties props = new java.util.Properties();
FileInputStream fis new FileInputStream("myfile.txt");
props.load(fis)
そのため、プロパティファイルには任意のファイル拡張子を使用できます。また、を使用できる限り、ファイルはどこにでも保存できますFileInputStream
。
関連するメモとして、最新のフレームワークを使用する場合、フレームワークはプロパティファイルを開く追加の方法を提供する場合があります。たとえば、SpringはClassPathResource
、JARファイル内からパッケージ名を使用してプロパティファイルをロードするためにを提供しています。
プロパティの繰り返し処理については、プロパティが読み込まれるとjava.util.Properties
、propertyNames()
メソッドを提供するオブジェクトに格納されます。
プロパティファイルの読み取りとその内容の読み込み Properties
String filename = "sample.properties";
Properties properties = new Properties();
input = this.getClass().getClassLoader().getResourceAsStream(filename);
properties.load(input);
以下は、反復する効率的な方法です Properties
for (Entry<Object, Object> entry : properties.entrySet()) {
System.out.println(entry.getKey() + " => " + entry.getValue());
}
Java 8のすべてのあなたの特性を取得します
public static Map<String, String> readPropertiesFile(String location) throws Exception {
Map<String, String> properties = new HashMap<>();
Properties props = new Properties();
props.load(new FileInputStream(new File(location)));
props.forEach((key, value) -> {
properties.put(key.toString(), value.toString());
});
return properties;
}
1)プロパティファイルをクラスパスに置くのは良いことですが、プロジェクトのどこにでも置くことができます。
以下は、クラスパスからプロパティファイルを読み込み、すべてのプロパティを読み取る方法です。
Properties prop = new Properties();
InputStream input = null;
try {
String filename = "path to property file";
input = getClass().getClassLoader().getResourceAsStream(filename);
if (input == null) {
System.out.println("Sorry, unable to find " + filename);
return;
}
prop.load(input);
Enumeration<?> e = prop.propertyNames();
while (e.hasMoreElements()) {
String key = (String) e.nextElement();
String value = prop.getProperty(key);
System.out.println("Key : " + key + ", Value : " + value);
}
} catch (IOException ex) {
ex.printStackTrace();
} finally {
if (input != null) {
try {
input.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
2)プロパティファイルの拡張子は.propertiesです。
プロパティを反復処理する別の方法を次に示します。
Enumeration eProps = properties.propertyNames();
while (eProps.hasMoreElements()) {
String key = (String) eProps.nextElement();
String value = properties.getProperty(key);
System.out.println(key + " => " + value);
}
昨年、このプロパティフレームワークについて書きました。プロパティをロードする複数の方法を提供し、それらも強く型付けされます。
見てhttp://sourceforge.net/projects/jhpropertiestyp/
JHPropertiesTypedは、厳密に型指定されたプロパティを開発者に提供します。既存のプロジェクトに簡単に統合できます。プロパティタイプの大規模なシリーズで処理されます。プロパティIO実装を介して1行でプロパティを初期化する機能を提供します。独自のプロパティタイプとプロパティIOを作成する機能を開発者に提供します。上記のスクリーンショットのWebデモも利用できます。プロパティを使用する場合は、プロパティを管理するためのWebフロントエンドの標準実装もあります。
完全なドキュメント、チュートリアル、javadoc、FAQなどは、プロジェクトのWebページで入手できます。
ここで準備ができた静的クラス
import java.io.*;
import java.util.Properties;
public class Settings {
public static String Get(String name,String defVal){
File configFile = new File(Variables.SETTINGS_FILE);
try {
FileReader reader = new FileReader(configFile);
Properties props = new Properties();
props.load(reader);
reader.close();
return props.getProperty(name);
} catch (FileNotFoundException ex) {
// file does not exist
logger.error(ex);
return defVal;
} catch (IOException ex) {
// I/O error
logger.error(ex);
return defVal;
} catch (Exception ex){
logger.error(ex);
return defVal;
}
}
public static Integer Get(String name,Integer defVal){
File configFile = new File(Variables.SETTINGS_FILE);
try {
FileReader reader = new FileReader(configFile);
Properties props = new Properties();
props.load(reader);
reader.close();
return Integer.valueOf(props.getProperty(name));
} catch (FileNotFoundException ex) {
// file does not exist
logger.error(ex);
return defVal;
} catch (IOException ex) {
// I/O error
logger.error(ex);
return defVal;
} catch (Exception ex){
logger.error(ex);
return defVal;
}
}
public static Boolean Get(String name,Boolean defVal){
File configFile = new File(Variables.SETTINGS_FILE);
try {
FileReader reader = new FileReader(configFile);
Properties props = new Properties();
props.load(reader);
reader.close();
return Boolean.valueOf(props.getProperty(name));
} catch (FileNotFoundException ex) {
// file does not exist
logger.error(ex);
return defVal;
} catch (IOException ex) {
// I/O error
logger.error(ex);
return defVal;
} catch (Exception ex){
logger.error(ex);
return defVal;
}
}
public static void Set(String name, String value){
File configFile = new File(Variables.SETTINGS_FILE);
try {
Properties props = new Properties();
FileReader reader = new FileReader(configFile);
props.load(reader);
props.setProperty(name, value.toString());
FileWriter writer = new FileWriter(configFile);
props.store(writer, Variables.SETTINGS_COMMENT);
writer.close();
} catch (FileNotFoundException ex) {
// file does not exist
logger.error(ex);
} catch (IOException ex) {
// I/O error
logger.error(ex);
} catch (Exception ex){
logger.error(ex);
}
}
public static void Set(String name, Integer value){
File configFile = new File(Variables.SETTINGS_FILE);
try {
Properties props = new Properties();
FileReader reader = new FileReader(configFile);
props.load(reader);
props.setProperty(name, value.toString());
FileWriter writer = new FileWriter(configFile);
props.store(writer,Variables.SETTINGS_COMMENT);
writer.close();
} catch (FileNotFoundException ex) {
// file does not exist
logger.error(ex);
} catch (IOException ex) {
// I/O error
logger.error(ex);
} catch (Exception ex){
logger.error(ex);
}
}
public static void Set(String name, Boolean value){
File configFile = new File(Variables.SETTINGS_FILE);
try {
Properties props = new Properties();
FileReader reader = new FileReader(configFile);
props.load(reader);
props.setProperty(name, value.toString());
FileWriter writer = new FileWriter(configFile);
props.store(writer,Variables.SETTINGS_COMMENT);
writer.close();
} catch (FileNotFoundException ex) {
// file does not exist
logger.error(ex);
} catch (IOException ex) {
// I/O error
logger.error(ex);
} catch (Exception ex){
logger.error(ex);
}
}
}
ここにサンプル:
Settings.Set("valueName1","value");
String val1=Settings.Get("valueName1","value");
Settings.Set("valueName2",true);
Boolean val2=Settings.Get("valueName2",true);
Settings.Set("valueName3",100);
Integer val3=Settings.Get("valueName3",100);
次の方法でプロパティファイルをロードできます。
InputStream is = new Test().getClass().getClassLoader().getResourceAsStream("app.properties");
Properties props = new Properties();
props.load(is);
そして、次のようなラムダ式を使用してマップを反復できます。
props.stringPropertyNames().forEach(key -> {
System.out.println("Key is :"+key + " and Value is :"+props.getProperty(key));
});