サーチ…


前書き

プロパティオブジェクトには、キーと値のペアが両方とも文字列として格納されます。 java.util.Propertiesクラスは、Hashtableのサブクラスです。

これは、プロパティキーに基づいてプロパティ値を取得するために使用できます。 Propertiesクラスは、プロパティファイルからデータを取得し、データをプロパティファイルに格納するメソッドを提供します。また、システムのプロパティを取得するために使用できます。

プロパティファイルの利点

情報がプロパティファイルから変更された場合、再コンパイルは必要ありません。

構文

  • プロパティファイルでは次のようになります。
  • キー=値
  • #コメント

備考

Propertiesオブジェクトは、キーと値が規約に従ってStringであるMapです。 Mapのメソッドを使用してデータにアクセスすることはできますが、通常はより安全なメソッドgetPropertysetProperty 、および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


Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow