Java > getResourceAsStreamの使い方

更新日 2011-11-30
広告

リソースファイルの利用方法を紹介します(Java version 1.6.0)。

getResourceAsStreamメソッドを利用すると、リソースファイル(設定ファイルなどのこと)を簡単に読み込むことができます。 以下の説明では、リソースファイルとして app.properties を利用します(参考: java.util.Propertiesの使い方)。 app.propertiesの内容は以下のとおりです。

name=MyApplication

インスタンス経由

app.properties を読み込むサンプル TestApp は以下です。

package sweng.sample;

import java.io.*;
import java.util.*;

public class TestApp {
    // コンストラクタ
    public TestApp() throws IOException {
        InputStream is = this.getClass().getResourceAsStream("app.properties");
        Properties props = new Properties();
        props.load(is);
        is.close();

        System.out.println("value = " + props.getProperty("name"));
    }

    public static void main(String[] args) throws IOException {
        System.out.println("getResourceAsSteam");
        TestApp app = new TestApp();
    }
}

コンストラクタの中で app.properties を読み込んでいます。 app.propertiesとTestApp.classは、同じクラスパスの場所に配置する必要があります。 今回は、sweng/sample以下に配置してあります。
GetResourceAsStream$ ls sweng/sample/
TestApp.class  app.properties
TestAppの実行結果は以下のとおりです。
GetResourceAsStream$ java sweng.sample.TestApp
getResourceAsString
value = MyApplication
TestAppは、コンストラクタの中、つまりクラスのインスタンス(this)経由でリソースファイルを取得しています。

スタティック経由

次のサンプル TestApp2 は、staticなコンテキストからリソースファイルを取得する例です。
package sweng.sample;

import java.io.*;
import java.util.*;

public class TestApp2 {
    // staticメソッド
    public static void load() throws IOException {
        InputStream is = TestApp2.class.getResourceAsStream("app.properties");
        Properties props = new Properties();
        props.load(is);
        is.close();

        System.out.println("value = " + props.getProperty("name"));
    }

    public static void main(String[] args) throws IOException {
        System.out.println("getResourceAsStream static");
        TestApp2.load();
    }
}

loadメソッドはstaticメソッドなので、this変数にアクセスできません。 代わりに TestApp2.class 経由でリソースファイルにアクセスできます。

TestApp2を実行すると、以下の結果になります。 (app.propertiesの配置場所はTestAppの場合と同じです)

GetResourceAsStream$ java sweng.sample.TestApp2
getResourceAsString static
value = MyApplication

クラスパス経由

上記の例だと、クラスファイルとapp.propertiesを同じディレクトリに置く必要があります。 以下の例のように、クラスローダーを使うと、クラスパスが通ってるディレクトリのどこにapp.propertiesを置いてもよくなります。
package sweng.sample;

import java.io.*;
import java.util.*;

public class TestApp3 {
    // static method
    public static void load() throws IOException {
        InputStream is = TestUtils.class.getClassLoader().getResourceAsStream("app.properties")
        Properties props = new Properties();
        props.load(is);
        is.close();

        System.out.println("value = " + props.getProperty("name"));
    }

    public static void main(String[] args) throws IOException {
        System.out.println("getResourceAsStream static");
        TestApp2.load();
    }
}
広告
お問い合わせは sweng.tips@gmail.com まで。
inserted by FC2 system