私は、Javaプロパティファイルとして保存し、後でロードして反復したい構成値のキー/値ペアのリストを持っています。
質問:
.txt
は問題ありませんか?InputStreamをPropertyに渡すことができるので、ファイルはほとんどどこにでも置くことができ、何でも呼び出せます。
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);
}
あなたはあなたが好きな場所にファイルを保存することができます。 jarファイルに保存したい場合は、Class.getResourceAsStream()
またはClassLoader.getResourceAsStream()
を使用してアクセスします。ファイルシステム上にあれば、少し簡単です。
私の経験では.propertiesがより一般的ですが、どんな拡張子でも問題ありません。
Java 6を使用している場合はInputStream
name__またはStreamReader
name__を渡して、Properties.load
を使用してファイルをロードします。(がの場合、( - === - )おそらく、ストリームのデフォルトのISO-8859-1エンコーディングの代わりにUTF-8とReader
name__を使用してください。)
通常のHashtable
name__(Properties
name__の派生元)を反復するときに繰り返します。 keySet()
を使います。あるいは、propertyNames()
によって返された列挙を使用することもできます。
プロパティファイルをクラスFooと同じパッケージに入れると、次のようにして簡単に読み込むことができます。
new Properties().load(Foo.class.getResourceAsStream("file.properties"))
PropertiesがHashtableを拡張することを考えれば、Hashtableと同じ方法で値を反復することができます。
* .properties拡張子を使用すると、エディタのサポートを受けることができます。 Eclipseにはプロパティファイルエディタがあります。
properties
ファイルを作成して読み込む方法はたくさんあります。
.properties
拡張をお勧めしますが、あなたはあなた自身のものを選ぶことができます。Java.util
package => 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 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);
これはプロパティファイルをロードします。
Properties prop = new Properties();
InputStream stream = ...; //the stream to the file
try {
prop.load(stream);
} finally {
stream.close();
}
私はすべての設定ファイルがあるディレクトリに.propertiesファイルを置くのに使います、私はそれをアクセスするクラスと一緒にそれを置きません、しかしここで制限はありません。
名前のために...私は冗長さのために.propertiesを使用します、あなたが望まないのなら私はあなたがそれを.propertiesと名付けるべきではないと思います。
プロパティファイルを読み込み、その内容を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());
}
特性は遺産になりました。 Preferences classは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>
こちらを見てください 記事 環境設定ストアの内部
デフォルトでは、Javaはアプリケーションの作業ディレクトリでそれを開きます(この動作は実際には使用されているOSによって異なります)。ファイルをロードするには、次のようにします。
Properties props = new Java.util.Properties();
FileInputStream fis new FileInputStream("myfile.txt");
props.load(fis)
そのため、プロパティファイルには任意のファイル拡張子を使用できます。さらに、FileInputStream
を使用できるのであれば、ファイルはどこにでも保存できます。
最新のフレームワークを使用する場合の関連する注意事項として、フレームワークはプロパティファイルを開くための追加の方法を提供することがあります。たとえば、SpringはJARファイル内からパッケージ名を使用してプロパティファイルをロードするためのClassPathResource
を提供しています。
プロパティの繰り返し処理については、一度プロパティがロードされると、それらはJava.util.Properties
オブジェクトに格納されます。これはpropertyNames()
メソッドを提供します。
順番に:
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です。
In 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;
}
私は昨年、この財産枠組みについて書きました。それはプロパティをロードするための複数の方法を提供し、それらを同様に強く型付けさせるでしょう。
ご覧ください http://sourceforge.net/projects/jhpropertiestyp/
JHPropertiesTypedは開発者に強く型付けされたプロパティを与えます。既存のプロジェクトに簡単に統合できます。プロパティタイプの大規模なシリーズによって処理されます。 property IOの実装により、プロパティを一行で初期化することができます。開発者に独自のプロパティタイプとプロパティIOを作成する権限を与えます。上のスクリーンショットはWebデモもあります。あなたがそれを使用することを選択した場合、プロパティを管理するためのWebフロントエンドの標準実装もあります。
完全なドキュメンテーション、チュートリアル、javadoc、faqなどはプロジェクトのウェブページにあります。
これは、プロパティを反復処理するもう1つの方法です。
Enumeration eProps = properties.propertyNames();
while (eProps.hasMoreElements()) {
String key = (String) eProps.nextElement();
String value = properties.getProperty(key);
System.out.println(key + " => " + value);
}
ここで準備ができている静的クラス
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);