Java Language
プロパティクラス
サーチ…
前書き
プロパティオブジェクトには、キーと値のペアが両方とも文字列として格納されます。 java.util.Propertiesクラスは、Hashtableのサブクラスです。
これは、プロパティキーに基づいてプロパティ値を取得するために使用できます。 Propertiesクラスは、プロパティファイルからデータを取得し、データをプロパティファイルに格納するメソッドを提供します。また、システムのプロパティを取得するために使用できます。
プロパティファイルの利点
情報がプロパティファイルから変更された場合、再コンパイルは必要ありません。
構文
- プロパティファイルでは次のようになります。
- キー=値
- #コメント
備考
Propertiesオブジェクトは、キーと値が規約に従ってStringであるMapです。 Mapのメソッドを使用してデータにアクセスすることはできますが、通常はより安全なメソッドgetProperty 、 setProperty 、およびstringPropertyNamesが代わりに使用されます。
プロパティは、単純なテキストファイルであるJavaプロパティファイルに頻繁に格納されます。それらの形式は、 Properties.loadメソッドで完全に文書化されています 。要約すれば:
- 各キー/値のペアは、空白のテキストの行である(等しい
=
)、またはコロン(:
)キーと値の間。 equalsまたはコロンには前後の空白があり、無視されます。 - 先行する空白は常に無視され、末尾の空白は常に含まれます。
- バックスラッシュを使用して任意の文字(小文字の
u
を除く)をエスケープすることができます。 - 行末のバックスラッシュは、次の行が現在の行の続きであることを示します。しかし、すべての行と同様に、継続行の先頭の空白は無視されます。
- Javaソースコードと同様に、
\u
続く4桁の16進数はUTF-16文字を表します。
java.util.ResourceBundleのようなJava SE独自の機能を含むほとんどのフレームワークは、プロパティファイルをInputStreamとしてロードします。 InputStreamからプロパティファイルを読み込むとき、そのファイルにはISO 8859-1文字(0-255の範囲の文字)のみが含まれます。他の任意の文字を表現しなければならない\u
エスケープ。ただし、任意のエンコーディングでテキストファイルを作成し、それをエスケープするためにnative2asciiツール(すべてのJDKに付属)を使用することができます。
独自のコードを含むプロパティファイルをロードする場合、対応するCharsetに基づいてReader( InputStreamReaderなど)を作成する限り、どのエンコーディングでもかまいません。レガシーロード(InputStream)メソッドの代わりにload(Reader)を使用してファイルをロードできます。
プロパティを単純なXMLファイルに格納することもできます。これにより、ファイル自体でエンコーディングを定義できます。このようなファイルは、 loadFromXMLメソッドでロードできます。このようなXMLファイルの構造を記述するDTDは、 http://java.sun.com/dtd/properties.dtdにあります。
ロードプロパティ
アプリケーションにバンドルされているプロパティファイルをロードするには:
public class Defaults {
public static Properties loadDefaults() {
try (InputStream bundledResource =
Defaults.class.getResourceAsStream("defaults.properties")) {
Properties defaults = new Properties();
defaults.load(bundledResource);
return defaults;
} catch (IOException e) {
// Since the resource is bundled with the application,
// we should never get here.
throw new UncheckedIOException(
"defaults.properties not properly packaged"
+ " with application", e);
}
}
}
プロパティファイルcaveat:末尾の空白
一見完全に同一であるこれらの2つのプロパティファイルを詳しく見てみましょう:
彼らは本当に同一ではありません:
(スクリーンショットはNotepad ++からのものです)
末尾の空白が保存されるための値lastName
あろう"Smith"
最初のケースとで"Smith "
第二の場合です。
非常にまれに、これはユーザーが期待しているもので、これがなぜProperties
クラスのデフォルトの動作であるのか推測することはできません。ただし、この問題を解決する拡張バージョンのProperties
を作成するのは簡単です。次のクラス、 TrimmedPropertiesはそれだけを行います。これは、標準のPropertiesクラスのドロップイン置換です。
import java.io.FileInputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.Reader;
import java.util.Map.Entry;
import java.util.Properties;
/**
* Properties class where values are trimmed for trailing whitespace if the
* properties are loaded from a file.
*
* <p>
* In the standard {@link java.util.Properties Properties} class trailing
* whitespace is always preserved. When loading properties from a file such
* trailing whitespace is almost always <i>unintentional</i>. This class fixes
* this problem. The trimming of trailing whitespace only takes place if the
* source of input is a file and only where the input is line oriented (meaning
* that for example loading from XML file is <i>not</i> changed by this class).
* For this reason this class is almost in all cases a safe drop-in replacement
* for the standard <tt>Properties</tt>
* class.
*
* <p>
* Whitespace is defined here as any of space (U+0020) or tab (U+0009).
* *
*/
public class TrimmedProperties extends Properties {
/**
* Reads a property list (key and element pairs) from the input byte stream.
*
* <p>Behaves exactly as {@link java.util.Properties#load(java.io.InputStream) }
* with the exception that trailing whitespace is trimmed from property values
* if <tt>inStream</tt> is an instance of <tt>FileInputStream</tt>.
*
* @see java.util.Properties#load(java.io.InputStream)
* @param inStream the input stream.
* @throws IOException if an error occurred when reading from the input stream.
*/
@Override
public void load(InputStream inStream) throws IOException {
if (inStream instanceof FileInputStream) {
// First read into temporary props using the standard way
Properties tempProps = new Properties();
tempProps.load(inStream);
// Now trim and put into target
trimAndLoad(tempProps);
} else {
super.load(inStream);
}
}
/**
* Reads a property list (key and element pairs) from the input character stream in a simple line-oriented format.
*
* <p>Behaves exactly as {@link java.util.Properties#load(java.io.Reader)}
* with the exception that trailing whitespace is trimmed on property values
* if <tt>reader</tt> is an instance of <tt>FileReader</tt>.
*
* @see java.util.Properties#load(java.io.Reader) }
* @param reader the input character stream.
* @throws IOException if an error occurred when reading from the input stream.
*/
@Override
public void load(Reader reader) throws IOException {
if (reader instanceof FileReader) {
// First read into temporary props using the standard way
Properties tempProps = new Properties();
tempProps.load(reader);
// Now trim and put into target
trimAndLoad(tempProps);
} else {
super.load(reader);
}
}
private void trimAndLoad(Properties p) {
for (Entry<Object, Object> entry : p.entrySet()) {
if (entry.getValue() instanceof String) {
put(entry.getKey(), trimTrailing((String) entry.getValue()));
} else {
put(entry.getKey(), entry.getValue());
}
}
}
/**
* Trims trailing space or tabs from a string.
*
* @param str
* @return
*/
public static String trimTrailing(String str) {
if (str != null) {
// read str from tail until char is no longer whitespace
for (int i = str.length() - 1; i >= 0; i--) {
if ((str.charAt(i) != ' ') && (str.charAt(i) != '\t')) {
return str.substring(0, i + 1);
}
}
}
return str;
}
}
XMLとしてのプロパティの保存
XMLファイルへのプロパティの格納
プロパティファイルをXMLファイルとして保存する方法は、 .properties
ファイルとして保存する方法と非常によく似ています。 store()
を使用する代わりに、 storeToXML()
を使用します。
public void saveProperties(String location) throws IOException{
// make new instance of properties
Properties prop = new Properties();
// set the property values
prop.setProperty("name", "Steve");
prop.setProperty("color", "green");
prop.setProperty("age", "23");
// check to see if the file already exists
File file = new File(location);
if (!file.exists()){
file.createNewFile();
}
// save the properties
prop.storeToXML(new FileOutputStream(file), "testing properties with xml");
}
ファイルを開くと、次のようになります。
XMLファイルからのプロパティのロード
このファイルをproperties
としてload()
するには、通常の.propeties
ファイルで使用するload()
代わりにloadFromXML()
を呼び出す必要があります。
public static void loadProperties(String location) throws FileNotFoundException, IOException{
// make new properties instance to load the file into
Properties prop = new Properties();
// check to make sure the file exists
File file = new File(location);
if (file.exists()){
// load the file
prop.loadFromXML(new FileInputStream(file));
// print out all the properties
for (String name : prop.stringPropertyNames()){
System.out.println(name + "=" + prop.getProperty(name));
}
} else {
System.err.println("Error: No file found at: " + location);
}
}
このコードを実行すると、コンソールに次のコードが表示されます。
age=23
color=green
name=Steve