2012/05/03

JavaでXMLプロパティの読み書きを行う

Javaのプロパティファイルは、手動でASCIIコードに変換するか、プロパティエディタを利用しないと扱えない。
特に日本語をプロパティファイルに書き込みたい場合は苦労します。

そこでプロパティファイルをXMLで定義してしまえば、ASCIIコード変換もプロパティエディタも必要ありません。

XMLにするとパースが面倒と思われますが、パースする必要もありません。

JavaでXMLプロパティを扱う方法をご紹介します。


読み込むXMLプロパティの形式は次の通りです。

■sample.properties


<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">

コメント
value001
プロパティ値


エンコーディングは「UTF-8(デフォルト)」にしてあります。

キーの指定は、entryタグのkey属性に記述します。
値の指定は、entryタグで囲まれたvalueに記述します。

値は、改行することも可能です。ただし、改行コードが値に含まれるので注意してください。


XMLプロパティを読み込んでプロパティインスタンスにする方法は次の通りです。

■XMLプロパティ読み込み

 /**
  * 指定したXMLプロパティファイルをロードして返します。
  * 
  * @param filePath XMLプロパティファイルパス
  * @return プロパティクラス
  * @throws IOException プロパティファイルが読み込めない場合
  */
 public Properties loadXMLProperties(String filePath) throws IOException {
  // プロパティクラスインスタンス
  Properties properties = new Properties();
  // 入力ストリーム構築
  InputStream in = new FileInputStream(filePath);
  // XML形式のプロパティファイルをロード
  // 入力ストリームはloadFromXMLでクローズされる
  properties.loadFromXML(in);
  // プロパティインスタンスを返す
  return properties;
 }
メソッド内で、 FileInputStreamを構築していますが、クローズする必要はありません。
loadFromXML(in)メソッド内でクローズされます。

次に書き込む方法です。

■XMLプロパティ書き込み

 /**
  * プロパティをXMLプロパティファイルで保存します。
  * 
  * @param properties プロパティクラス
  * @param filePath XMLプロパティファイルパス
  * @param comments コメント(任意) または null
  * @throws IOException XMLファイルとして書き込みできない場合
  */
 public void storeXMLProperties(Properties properties, String filePath, String comments) throws IOException {
  OutputStream os = null;
  try {
   // 出力ストリーム構築
   os = new FileOutputStream(filePath);
   // XML形式のプロパティファイルを出力
   properties.storeToXML(os, comments);
  }
  catch (IOException e) {
   // 例外を通知
   throw e;
  }
  finally {
   // 出力ストリームをクローズ
   os.close();
  }
 }

storeToXMLメソッド内では、FileOutputStreamをクローズしていないので、自分でクローズします。
例のソースコードでは、エンコーディングを指定していないので、UTF-8(デフォルト)になります。
他の文字コードを指定する場合には、storeToXML(OutputStream os, String comment, String encoding)にエンコーディングを指定してください。

クラスの全行は次の通りです。

■XMLProperties.java

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Properties;

/**
 * {@link XMLProperties}クラスです。
 * 
 * 
 * @author ardor
 * @version 1.0
 */
public class XMLProperties {
 
 /**
  * 指定したXMLプロパティファイルをロードして返します。
  * 
  * @param filePath XMLプロパティファイルパス
  * @return プロパティクラス
  * @throws IOException プロパティファイルが読み込めない場合
  */
 public Properties loadXMLProperties(String filePath) throws IOException {
  // プロパティクラスインスタンス
  Properties properties = new Properties();
  // 入力ストリーム構築
  InputStream in = new FileInputStream(filePath);
  // XML形式のプロパティファイルをロード
  // 入力ストリームはloadFromXMLでクローズされる
  properties.loadFromXML(in);
  // プロパティインスタンスを返す
  return properties;
 }
 
 /**
  * プロパティをXMLプロパティファイルで保存します。
  * 
  * @param properties プロパティクラス
  * @param filePath XMLプロパティファイルパス
  * @param comments コメント(任意) または null
  * @throws IOException XMLファイルとして書き込みできない場合
  */
 public void storeXMLProperties(Properties properties, String filePath, String comments) throws IOException {
  OutputStream os = null;
  try {
   // 出力ストリーム構築
   os = new FileOutputStream(filePath);
   // XML形式のプロパティファイルを出力
   properties.storeToXML(os, comments);
  }
  catch (IOException e) {
   // 例外を通知
   throw e;
  }
  finally {
   // 出力ストリームをクローズ
   os.close();
  }
 }
}

0 件のコメント:

コメントを投稿