LoginSignup
19
26

More than 5 years have passed since last update.

XML形式のプロパティファイル読み書きメモ

Last updated at Posted at 2013-09-29

XML 形式のプロパティファイルを読み書きする方法メモ。

環境

OS

Windows7 64bit

Java

1.7.0_25

書き出し

実装

プロパティファイルの書き出し
import java.io.FileOutputStream;
import java.io.OutputStream;
import java.util.Properties;

public class Main {

    public static void main(String[] args) throws Exception {
        Properties prop = new Properties();
        prop.setProperty("hoge", "ほげ");
        prop.setProperty("fuga", "ふが");
        prop.setProperty("piyo", "ぴよ");

        try (OutputStream os = new FileOutputStream("prop.xml")) {
            prop.storeToXML(os, "コメント");
        }
    }
}

書き出し結果

prop.xml
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties>
<comment>コメント</comment>
<entry key="piyo">ぴよ</entry>
<entry key="fuga">ふが</entry>
<entry key="hoge">ほげ</entry>
</properties>

読み込み

実装

プロパティファイルの読み込み
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.Map.Entry;
import java.util.Properties;

public class Main {

    public static void main(String[] args) throws Exception {
        Properties prop = new Properties();
        InputStream is = new FileInputStream("prop.xml");

        prop.loadFromXML(is); // is はこのメソッドが終了すると close される

        for (Entry<Object, Object> entry : prop.entrySet()) {
            System.out.println(entry.getKey() + " = " + entry.getValue());
        }
    }
}

読み込み結果

標準出力
piyo = ぴよ
fuga = ふが
hoge = ほげ

storeToXML()loadFromXML() で引数のストリームの扱いが若干違う

storeToXML() はメソッドが終了しても引数のストリームはクローズされないが、 loadFromXML() はメソッドが終了すると引数のストリームはクローズされる。

storeToXML | Properties (Java Platform SE 7)

指定されたストリームは、このメソッドが復帰したあとも 開いたままです

loadFromXML | Properties (Java Platform SE 7)

このメソッドが戻ると、指定されたストリームが 閉じられます

文字コードの指定について

読み書きは、実行環境に関係なくデフォルト UTF-8 で行われる。

Properties (Java Platform SE 7)

loadFromXML(InputStream) および storeToXML(OutputStream, String, String) メソッドは、プロパティーを単純な XML 形式としてロードおよび格納できます。 デフォルトでは UTF-8 文字エンコーディングが使用されます が、必要に応じてエンコーディングを指定できます。

なので、 特に文字コードを明示的に指定する必要はないっぽい。

エンコーディングを指定したい場合は、 loadFromXML() の第三引数で指定する。
読み込みの時は、 XML の先頭にエンコードが記述されているので、コード上での指定は不要っぽい。

Shift_JISを指定
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Map.Entry;
import java.util.Properties;

public class Main {

    public static void main(String[] args) throws Exception {
        Properties prop = new Properties();
        prop.setProperty("hoge", "ほげ");
        prop.setProperty("fuga", "ふが");
        prop.setProperty("piyo", "ぴよ");

        try (OutputStream os = new FileOutputStream("prop.xml")) {
            prop.storeToXML(os, "コメント", "Shift_JIS");
        }

        prop = new Properties();

        InputStream is = new FileInputStream("prop.xml");
        prop.loadFromXML(is);

        for (Entry<Object, Object> entry : prop.entrySet()) {
            System.out.println(entry.getKey() + " = " + entry.getValue());
        }
    }
} 
prop.xml
<?xml version="1.0" encoding="Shift_JIS" standalone="no"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties>
<comment>コメント</comment>
<entry key="piyo">ぴよ</entry>
<entry key="fuga">ふが</entry>
<entry key="hoge">ほげ</entry>
</properties>

参考

19
26
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
19
26