Javaとプロパティファイル:設定をスマートに管理しよう!

docs

こんにちは!Javaプログラミング、楽しんでますか?

今回は「プロパティファイルの扱い」について解説していきます。

「プロパティファイルって何?」って思った人もいるかもしれませんね。簡単に言うと、Javaアプリケーションの設定情報を保存しておくファイルのことです。データベースの接続情報や、アプリケーションのバージョン、表示するメッセージなど、プログラムの動作に必要な様々な設定をここにまとめておくんです。

なぜプロパティファイルを使うの?

設定情報を直接プログラムの中に書き込んでも動くじゃん、と思うかもしれません。もちろん、それでも動きます。でも、考えてみてください。もしデータベースの接続情報が変わったらどうしますか? プログラムを書き換えて、コンパイルし直して、デプロイし直して…と、とっても手間がかかりますよね。

プロパティファイルを使えば、こんな手間は必要ありません。プロパティファイルだけを書き換えれば、プログラムをコンパイルし直すことなく設定を変更できるんです。これは、アプリケーションの保守性柔軟性を大きく向上させてくれます。

プロパティファイルの中身を見てみよう

プロパティファイルは、.propertiesという拡張子がついたテキストファイルです。中身はいたってシンプルで、「キーと値」のペアが並んでいます。

Properties

# これはコメントです
database.url=jdbc:mysql://localhost:3306/mydb
database.username=user
database.password=password
application.version=1.0.0
message.welcome=ようこそ!
  • #で始まる行はコメントです。
  • キー=値の形式で設定を記述します。キーは設定項目を識別するための名前、値は設定内容です。

Javaでプロパティファイルを読み込んでみよう

さて、いよいよ本番です。Javaでこのプロパティファイルをどうやって読み込むのか、具体的なコードを見ていきましょう。Javaにはjava.util.Propertiesという便利なクラスがあります。

1. プロパティファイルを用意する

まずは、先ほどのconfig.propertiesという名前のファイルをプロジェクトの適当な場所(例えば、srcフォルダの直下やresourcesフォルダなど)に作成してみましょう。

Properties

# config.properties
app.name=MyAwesomeApp
app.version=2.0.0
data.source=local

2. Javaコードで読み込む

Java

import java.io.FileInputStream;
import java.io.IOException;
import java.util.Properties;

public class PropertyReader {

    public static void main(String[] args) {
        Properties prop = new Properties(); // Propertiesオブジェクトを生成

        // try-with-resourcesを使ってFileInputStreamを自動的にクローズする
        try (FileInputStream fis = new FileInputStream("config.properties")) {
            prop.load(fis); // プロパティファイルを読み込む
            
            // 読み込んだ値を取得
            String appName = prop.getProperty("app.name");
            String appVersion = prop.getProperty("app.version");
            String dataSource = prop.getProperty("data.source");
            
            System.out.println("アプリケーション名: " + appName);
            System.out.println("バージョン: " + appVersion);
            System.out.println("データソース: " + dataSource);

            // 存在しないキーを指定した場合、nullが返る
            String nonExistentKey = prop.getProperty("non.existent.key");
            System.out.println("存在しないキーの値: " + nonExistentKey); 
            
            // デフォルト値を指定することもできる
            String defaultKey = prop.getProperty("another.key", "デフォルト値");
            System.out.println("デフォルト値の例: " + defaultKey);

        } catch (IOException e) {
            System.err.println("プロパティファイルの読み込み中にエラーが発生しました: " + e.getMessage());
        }
    }
}

このコードを実行すると、config.propertiesの内容が読み込まれ、それぞれの値がコンソールに出力されます。

  • FileInputStream: ファイルからデータを読み込むためのストリームです。ここではconfig.propertiesを指定しています。
  • prop.load(fis): Propertiesオブジェクトにファイルを読み込ませます。
  • prop.getProperty("キー名"): 指定したキーに対応する値を取得します。キーが存在しない場合はnullが返されます。
  • prop.getProperty("キー名", "デフォルト値"): キーが存在しない場合に、指定したデフォルト値を返します。

別の方法:クラスパスからの読み込み

先ほどの例では、アプリケーションと同じディレクトリにconfig.propertiesがあることを想定していました。しかし、JARファイルにまとめた場合など、アプリケーションの実行ディレクトリとは別の場所にプロパティファイルを置きたいこともありますよね。

そんなときは、クラスパスから読み込む方法が便利です。クラスパスとは、Javaがクラスファイルやリソースファイルを探す場所のことです。

1. プロパティファイルを配置する

例えば、src/main/resourcesディレクトリの下にapplication.propertiesというファイルを作成します。MavenやGradleといったビルドツールを使っている場合、このディレクトリは自動的にクラスパスに含まれます。

Properties

# src/main/resources/application.properties
server.port=8080
database.type=postgres

2. Javaコードで読み込む

Java

import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

public class ClasspathPropertyReader {

    public static void main(String[] args) {
        Properties prop = new Properties();
        // クラスローダーを使ってリソースを読み込む
        // クラスパス上のファイルを指定する場合は、先頭に「/」をつけない
        try (InputStream input = ClasspathPropertyReader.class.getClassLoader().getResourceAsStream("application.properties")) {
            if (input == null) {
                System.out.println("指定されたプロパティファイルが見つかりません。");
                return;
            }
            prop.load(input);

            String port = prop.getProperty("server.port");
            String dbType = prop.getProperty("database.type");

            System.out.println("サーバーポート: " + port);
            System.out.println("データベースタイプ: " + dbType);

        } catch (IOException e) {
            System.err.println("プロパティファイルの読み込み中にエラーが発生しました: " + e.getMessage());
        }
    }
}
  • ClasspathPropertyReader.class.getClassLoader().getResourceAsStream("application.properties"): これがクラスパスからリソース(ここではプロパティファイル)を読み込むための重要な部分です。InputStreamとして取得できるので、あとはprop.load()で読み込むだけです。

プロパティファイルに書き込んでみよう

プロパティファイルは読み込むだけでなく、プログラムから書き込むこともできます。例えば、アプリケーションの設定をユーザーが変更できるようにする場合などに使えます。

Java

import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Properties;

public class PropertyWriter {

    public static void main(String[] args) {
        Properties prop = new Properties();
        
        // 既存のプロパティを読み込む(存在しない場合は新しいPropertiesオブジェクトになる)
        try (FileInputStream fis = new FileInputStream("settings.properties")) {
            prop.load(fis);
        } catch (IOException e) {
            System.out.println("既存のsettings.propertiesが見つかりませんでした。新規作成します。");
        }

        // 新しいプロパティを追加または既存のプロパティを更新
        prop.setProperty("last.login.time", String.valueOf(System.currentTimeMillis()));
        prop.setProperty("user.theme", "dark");
        prop.setProperty("language", "ja");

        // ファイルに書き出す
        try (FileOutputStream fos = new FileOutputStream("settings.properties")) {
            // 第2引数はコメント。nullを指定するとコメントなし。
            prop.store(fos, "User Settings Updated"); 
            System.out.println("settings.propertiesに書き込みました。");
        } catch (IOException e) {
            System.err.println("プロパティファイルの書き込み中にエラーが発生しました: " + e.getMessage());
        }
    }
}
  • prop.setProperty("キー", "値"): 指定したキーと値のペアを追加または更新します。
  • prop.store(fos, "コメント"): Propertiesオブジェクトの内容をファイルに書き出します。第2引数にコメントを指定できます。

このコードを実行すると、settings.propertiesというファイルが作成(または更新)され、設定が書き込まれます。

日本語を扱う場合の注意点

プロパティファイルで日本語などの非ASCII文字を扱う場合、少し注意が必要です。デフォルトでは、プロパティファイルはISO-8859-1(Latin-1)エンコーディングで読み書きされます。このエンコーディングでは日本語は正しく表現できません。

UTF-8で読み書きする方法

Java 9以降であれば、Properties.load()Properties.store()ReaderWriterを渡すことで、エンコーディングを指定できます。

Java

import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.util.Properties;

public class JapanesePropertyExample {

    private static final String FILE_NAME = "messages.properties";

    public static void main(String[] args) {
        // 書き込み例 (UTF-8)
        writeJapaneseProperties();

        // 読み込み例 (UTF-8)
        readJapaneseProperties();
    }

    private static void writeJapaneseProperties() {
        Properties prop = new Properties();
        prop.setProperty("greeting", "こんにちは、世界!");
        prop.setProperty("farewell", "さようなら、またね!");

        try (FileWriter writer = new FileWriter(FILE_NAME, StandardCharsets.UTF_8)) {
            prop.store(writer, "Japanese messages");
            System.out.println("日本語プロパティを書き込みました: " + FILE_NAME);
        } catch (IOException e) {
            System.err.println("書き込みエラー: " + e.getMessage());
        }
    }

    private static void readJapaneseProperties() {
        Properties prop = new Properties();
        try (FileReader reader = new FileReader(FILE_NAME, StandardCharsets.UTF_8)) {
            prop.load(reader);
            System.out.println("読み込んだ挨拶: " + prop.getProperty("greeting"));
            System.out.println("読み込んだ別れの言葉: " + prop.getProperty("farewell"));
        } catch (IOException e) {
            System.err.println("読み込みエラー: " + e.getMessage());
        }
    }
}

これで、日本語が正しく表示されるはずです。

プロパティファイルの扱いをもっと深く知りたいなら

今回はJavaのプロパティファイルの基本的な使い方を解説しました。これで、あなたのJavaアプリケーションも、より柔軟で使いやすくなるはずです。

もっと詳しく知りたい人は、以下のリンクも参考にしてみてくださいね。
ToolDocs | 様々なツールや技術情報を紹介します


まとめ

  • プロパティファイルは、Javaアプリケーションの設定情報を「キーと値」の形式で保存するテキストファイルです。
  • プログラムを再コンパイルせずに設定を変更できるため、保守性柔軟性が向上します。
  • java.util.Propertiesクラスを使って、プロパティファイルの読み込み書き込みができます。
  • ファイルパスを指定して読み込む方法と、クラスパスから読み込む方法があります。
  • 日本語などの非ASCII文字を扱う場合は、UTF-8エンコーディングを指定して読み書きするようにしましょう。

プロパティファイルは、実際のアプリケーション開発では頻繁に利用される非常に重要な概念です。ぜひ今回の内容をマスターして、より良いJavaアプリケーションを開発してくださいね!


質問があったら、気軽に聞いてくださいね!

コメント

タイトルとURLをコピーしました