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
クラスは
Hashtable
クラスから
get()
メソッドを継承していますが、値を取得するために使用することはお勧めしません。その
get()メソッドは
String
にのみキャストできる
Object
値を返すので、
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
クラスは
Hashtable
クラスから
put()
methodおよび
putAll()
メソッドを継承していますが、
get()
メソッドと同じ理由でこれらを使用することはお勧めしません。
Properties
に使用できるのは
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以外の文字を含むプロパティは通常使用しないでください。
必要に応じて、JDK native2asciiツールなどのツールやファイルへの明示的なエンコーディングを使用して、この制限を回避することができます。
XMLファイルの場合、
loadFromXML()
メソッドおよび
storeToXML()
メソッドは、デフォルトでUTF-8文字エンコードを使用します。
しかし、異なる方法でエンコードされたXMLファイルを読み込むときは、
DOCTYPE
宣言でそれを指定できます。書き込みも十分に柔軟です –
storeToXML()
APIの3番目のパラメータでエンコーディングを指定できます。
10.結論
この記事では、プロパティとXMLフォーマットの両方で
Properties
loadキーストアとストアキーストアを使用する方法、値の取得、値の更新など、
Propertiesオブジェクトでキーと値のペアを操作する方法を含む基本的な
Properties
クラスの使用法について説明しました。 、そのサイズ、および
Properties__オブジェクトのデフォルトリストの使用方法を取得します。
例の完全なソースコードは、このhttps://github.com/eugenp/tutorials/tree/master/core-java[GitHubプロジェクト]にあります。