Javaアプリで設定情報を保存する方法 (XML編)

Javaでアプリを作っていると、設定情報などを保存したいときがあります。

いろいろなやり方がありますが、一番お手軽なのは、設定情報を保持したオブジェクトをそのままXML形式で保存することですね。
私はこのやり方をよく使っています。

WordPressへの接続情報を保存する

基本的に、設定情報などは何かしら専用のクラスを作りますよね。
例えば、JavaのアプリからWordPressに接続するとして、こんな情報を扱ったりするわけです。

  • エンドポイントURL
  • ユーザ名
  • パスワード
  • ブログID

こんなXML形式で保存できる

この情報を、こんな感じのXMLファイルで保存できます。
パッと見で大体わかるような感じに保存されてて、よさそうですよね。

<object class="jp.beourselves.open.sample.beanxml.BlogInfo" width="300" height="150">
 <void property="blogId">
  <int>1</int>
 </void>
 <void property="endPointUrl">
  <string>http://www.hogehoge.com/wordpress</string>
 </void>
 <void property="password">
  <string>hogeraccho</string>
 </void>
 <void property="username">
  <string>nishimura</string>
 </void>
</object>

ブログ情報を扱うクラスを作る

このブログ情報を扱うクラスはこんな感じになります。

BlogInfoクラス

package jp.beourselves.open.sample.beanio;

public class BlogInfo {
	/**
	 * エンドポイントURL
	 */
	private String endPointUrl;

	/**
	 * ユーザ名
	 */
	private String username;

	/**
	 * パスワード
	 */
	private String password;

	/**
	 * ブログID
	 */
	private int blogId;

	/**
	 * デフォルトコンストラクタ
	 */
	public BlogInfo(){}
	
	@Override
	public String toString() {
		return endPointUrl + "," + username + "," + password + "," + String.valueOf(blogId);
	}

	public String getEndPointUrl() {
		return endPointUrl;
	}

	public void setEndPointUrl(String endPointUrl) {
		this.endPointUrl = endPointUrl;
	}

	public String getUsername() {
		return username;
	}

	public void setUsername(String username) {
		this.username = username;
	}

	public String getPassword() {
		return password;
	}

	public void setPassword(String password) {
		this.password = password;
	}

	public int getBlogId() {
		return blogId;
	}

	public void setBlogId(int blogId) {
		this.blogId = blogId;
	}
}

いわゆる、Java Beansというやつです。

  • デフォルトコンストラクタ (引数なしのコンストラクタ)がある
  • プロパティのセッター、ゲッターがある

という条件でクラスを作っておくと、先のXML形式のファイルが簡単につくれるのです!

Java Beansの保存や読み込みを行う

BlogInfoクラスを保存したり読み込んだりするクラスは次のようになります。

BeanFileIOUtilクラス

package jp.beourselves.open.sample.beanio;

import java.beans.XMLDecoder;
import java.beans.XMLEncoder;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;

public class BeanFileIOUtil {
	/**
	 * Beanファイルを読み込む ファイルが存在しない場合は null が戻る
	 * @param fileName Beanファイル
	 * @return Bean (ファイルが存在しない場合 null)
	 */
	public static Object readBean(String fileName) {
		Object bean = null;
		try {
			XMLDecoder decoder = new XMLDecoder(new BufferedInputStream(
					new FileInputStream(fileName)));
			bean = decoder.readObject();
			decoder.close();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		}

		return bean;
	}

	/**
	 * Beanファイルを書き込む
	 * @param fileName Beanファイル
	 * @param bean 書き込むBean
	 */
	public static void writeBean(String fileName, Object bean) {
		try {
			File file = new File(fileName);

			// 指定のフォルダがない場合は作る (親フォルダがルートの場合は無視する)
			File parentDir = file.getParentFile();
			if (parentDir != null && !parentDir.exists())
				parentDir.mkdirs();

			XMLEncoder encoder = new XMLEncoder(new BufferedOutputStream(
					new FileOutputStream(fileName)));
			encoder.writeObject(bean);
			encoder.close();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		}
	}
}

readBean()で読み込み、writeBean()で保存ができます。
なお、readBean()で読み込むときに、ファイルが無かったら null が返るようにしています。

また、writeBean()で保存するときに、指定したフォルダがなかったら作るようにしています。

ファイルの読み書きをするときは、こういう例外処理を先に決めておくとコードが書きやすいですね。

キモになるのはXMLDecorderクラスXMLEncoderクラスですね。
詳細は特に説明しませんが、こういうクラスを使うことを覚えておいてください。

実際にBeanFileIOUtilクラスを使ってみよう

それでは、実際に先のBeanFileIOUtilを使ってみましょう。
こんなコードで実行できます。

package jp.beourselves.open.sample.beanio;

public class BeanFileIOUtilSample {
	public static void main(String[] args) {
		BeanFileIOUtilSample app = new BeanFileIOUtilSample();

		// ファイルに保存する
		app.write();
		
		// ファイルから読み込む
		app.read();
	}
	
	/**
	 * ファイルに保存する
	 */
	public void write(){
		// 保存するデータを生成する
		BlogInfo blogInfo = new BlogInfo();
		blogInfo.setEndPointUrl("http://www.hogehoge.com/wordpress");
		blogInfo.setUsername("nishimura");
		blogInfo.setPassword("hogeraccho");
		blogInfo.setBlogId(1);
				
		// ファイルにデータを保存する
		BeanFileIOUtil.writeBean("data/bloginfo.xml", blogInfo);
	}
	
	/**
	 * ファイルから読み込む
	 */
	public void read(){
		// ファイルからデータを読み込む
		BlogInfo blogInfo = (BlogInfo) BeanFileIOUtil.readBean("data/bloginfo.xml");
		System.out.println(blogInfo.toString());
	}
}

BlogInfoにブログ情報を作って保存し、その内容を読み出す、という動きになります。

Java Beans を XMLファイルに保存したり読み込んだりするのはほぼこの形になるので、自分なりにBeanFileIOUtilクラスのようなものを作っておくと何かと便利ですよ。

無料メールセミナー