Javaプロパティ入門
1. 概要
ほとんどのJavaアプリケーションは、コンパイルされたコードの外部で、一般に単純なパラメータをキーと値のペアとして格納するために、ある時点でプロパティを使用する必要があります。
そのため、この言語は、プロパティのファーストクラスサポート– java.util.Properties –このタイプの構成ファイルを処理するために設計されたユーティリティクラスを備えています。
これが、この記事で焦点を当てる内容です。
2. プロパティの読み込み
2.1. プロパティファイルから
プロパティファイルからキーと値のペアをロードする例から始めましょう。 クラスパスで利用可能な2つのファイルをロードしています。
app.properties:
version=1.0
name=TestApp
date=2016-11-12
そしてカタログ:
c1=files
c2=images
c3=videos
プロパティファイルでは「.properties」という接尾辞を使用することをお勧めしますが、必須ではないことに注意してください。
これで、それらをPropertiesインスタンスに非常に簡単にロードできます。
String rootPath = Thread.currentThread().getContextClassLoader().getResource("").getPath();
String appConfigPath = rootPath + "app.properties";
String catalogConfigPath = rootPath + "catalog";
Properties appProps = new Properties();
appProps.load(new FileInputStream(appConfigPath));
Properties catalogProps = new Properties();
catalogProps.load(new FileInputStream(catalogConfigPath));
String appVersion = appProps.getProperty("version");
assertEquals("1.0", appVersion);
assertEquals("files", catalogProps.getProperty("c1"));
ファイルのコンテンツがプロパティファイル形式の要件を満たしている限り、Propertiesクラスで正しく解析できます。 プロパティファイル形式の詳細は次のとおりです。
2.2. XMLファイルからロード
プロパティファイルに加えて、Propertiesクラスは特定のDTD仕様に準拠するXMLファイルをロードすることもできます。
XMLファイルicons.xmlからキーと値のペアをロードする例を次に示します。
<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties>
<comment>xml example</comment>
<entry key="fileIcon">icon1.jpg</entry>
<entry key="imageIcon">icon2.jpg</entry>
<entry key="videoIcon">icon3.jpg</entry>
</properties>
それでは、ロードしてみましょう。
String rootPath = Thread.currentThread().getContextClassLoader().getResource("").getPath();
String iconConfigPath = rootPath + "icons.xml";
Properties iconProps = new Properties();
iconProps.loadFromXML(new FileInputStream(iconConfigPath));
assertEquals("icon1.jpg", iconProps.getProperty("fileIcon"));
3. プロパティを取得
getProperty(String key)および getProperty(String key、String defaultValue)を使用して、そのキーで値を取得できます。
キーと値のペアが存在する場合、2つのメソッドは両方とも対応する値を返します。 ただし、そのようなキーと値のペアがない場合、前者はnullを返し、後者は代わりにdefaultValueを返します。
コード例:
String appVersion = appProps.getProperty("version");
String appName = appProps.getProperty("name", "defaultName");
String appGroup = appProps.getProperty("group", "baeldung");
String appDownloadAddr = appProps.getProperty("downloadAddr");
assertEquals("1.0", appVersion);
assertEquals("TestApp", appName);
assertEquals("baeldung", appGroup);
assertNull(appDownloadAddr);
Propertiesクラスはget()メソッドを Hashtable クラスから継承しますが、値を取得するために使用することはお勧めしません。 そのget()メソッドは Object 値を返しますが、これは String にのみキャストでき、 getProperty()メソッドはすでに処理しているためです。生のObject値が適切です。
以下のコードは、Exceptionをスローします。
float appVerFloat = (float) appProps.get("version");
4. プロパティを設定する
setProperty()メソッドを使用して、既存のキーと値のペアを更新したり、新しいキーと値のペアを追加したりできます。
コード例:
appProps.setProperty("name", "NewAppName"); // update an old value
appProps.setProperty("downloadAddr", "www.baeldung.com/downloads"); // add new key-value pair
String newAppName = appProps.getProperty("name");
assertEquals("NewAppName", newAppName);
String newAppDownloadAddr = appProps.getProperty("downloadAddr");
assertEquals("www.baeldung.com/downloads", newAppDownloadAddr);
Propertiesクラスはput()メソッドと putAll()メソッドを Hashtable クラスから継承しますが、使用することはお勧めしません。 get()メソッドの場合と同じ理由で、プロパティで使用できるのはString値のみです。
以下のコードは希望どおりに機能しません。getProperty()を使用して値を取得すると、nullが返されます。
appProps.put("version", 2);
5. プロパティを削除する
キーと値のペアを削除する場合は、 remove()メソッドを使用できます。
サンプルコード:
String versionBeforeRemoval = appProps.getProperty("version");
assertEquals("1.0", versionBeforeRemoval);
appProps.remove("version");
String versionAfterRemoval = appProps.getProperty("version");
assertNull(versionAfterRemoval);
6. 店
6.1. プロパティファイルに保存
Properties クラスは、キーと値のペアを出力するための store()メソッドを提供します。
コード例:
String newAppConfigPropertiesFile = rootPath + "newApp.properties";
appProps.store(new FileWriter(newAppConfigPropertiesFile), "store to properties file");
2番目のパラメーターはコメント用です。 コメントを書きたくない場合は、単にnullを使用してください。
6.2. XMLファイルに保存
Properties クラスは、キーと値のペアをXML形式で出力するための storeToXML()メソッドも提供します。
コード例:
String newAppConfigXmlFile = rootPath + "newApp.xml";
appProps.storeToXML(new FileOutputStream(newAppConfigXmlFile), "store to xml file");
2番目のパラメーターは、 store()メソッドのパラメーターと同じです。
7. その他の一般的な操作
Properties クラスは、プロパティを操作するための他のメソッドもいくつか提供します。
コード例:
appProps.list(System.out); // list all key-value pairs
Enumeration<Object> valueEnumeration = appProps.elements();
while (valueEnumeration.hasMoreElements()) {
System.out.println(valueEnumeration.nextElement());
}
Enumeration<Object> keyEnumeration = appProps.keys();
while (keyEnumeration.hasMoreElements()) {
System.out.println(keyEnumeration.nextElement());
}
int size = appProps.size();
assertEquals(3, size);
8. デフォルトのプロパティリスト
Properties オブジェクトには、デフォルトのプロパティリストとして別のPropertiesオブジェクトを含めることができます。 元のプロパティキーにプロパティキーが見つからない場合は、デフォルトのプロパティリストが検索されます。
「app.properties」の他に、クラスパスに「 default.properties」という別のファイルがあります。
default.properties:
site=www.google.com
name=DefaultAppName
topic=Properties
category=core-java
サンプルコード:
String rootPath = Thread.currentThread().getContextClassLoader().getResource("").getPath();
String defaultConfigPath = rootPath + "default.properties";
Properties defaultProps = new Properties();
defaultProps.load(new FileInputStream(defaultConfigPath));
String appConfigPath = rootPath + "app.properties";
Properties appProps = new Properties(defaultProps);
appProps.load(new FileInputStream(appConfigPath));
assertEquals("1.0", appVersion);
assertEquals("TestApp", appName);
assertEquals("www.google.com", defaultSite);
9. プロパティとエンコーディング
デフォルトでは、プロパティファイルはISO-8859-1(Latin-1)でエンコードされていると想定されているため、ISO-8859-1以外の文字を含むプロパティは通常使用しないでください。
必要に応じて、JDKnative2asciiツールやファイルの明示的なエンコーディングなどのツールを使用してこの制限を回避できます。
XMLファイルの場合、 loadFromXML()メソッドと storeToXML()メソッドは、デフォルトでUTF-8文字エンコードを使用します。
ただし、異なる方法でエンコードされたXMLファイルを読み取る場合は、DOCTYPE宣言で指定できます。 書き込みも十分に柔軟です。storeToXML()APIの3番目のパラメーターでエンコードを指定できます。
10. 結論
この記事では、 Properties クラスの基本的な使用法について説明しました。これには、 Properties の使用方法、プロパティとXML形式の両方でのキーと値のペアのロードと保存の方法、キーと値のペアの操作方法が含まれます。 Properties オブジェクトで、値の取得、値の更新、サイズの取得、Propertiesオブジェクトのデフォルトリストの使用方法など。
この例の完全なソースコードは、このGitHubプロジェクトで入手できます。