第13夜 Java SE 6はnative2ascii使わなくていいのはみんな知っていると思うが

みなさまJava SE 6への移行は進んでおりますでしょうか。もう7月になったということはJava2 SE 5.0のサポート期間は4ヶ月をきったということですよ。


そこで今後はJava SE 6での地味な改良をあげていきたいと思う。派手な話題はみんな飛びつくけど、地味な改良が実はうれしいのだ。

最初はみんな知ってる小ネタから。


J2SE 5.0からPropertiesがXMLを扱えるようになったのはご存知のとおり。それまでは7bitなファイルしか扱えなかった。理由はPropertiesクラスが1.0のときに登場した古参クラスであるということ。1.0はマルチバイトが対応しておらずみんなこんな感じだった。そもそもHashTableを継承してるのはどうよ、とかいいたいことはたくさんあると思うのだが、Javaが発表されたのが14年前。その前からあったことを考えると仕方あるまい。C++ですら標準化されておらず、普及してなかった時代だ。オブジェクト指向は差分プログラミングが当たり前の時代。

で、JavaSE 6からはloadとstoreクラスが拡張されている。

まずはプロパティファイルを作成してみる。拡張子を下手に扱うとnative2asciiや専用エディタを起動してしまうので拡張子はtxtにして以下のように書く。ここではUTF-8で作成してある。

星に願いを=年収300万の高級取りになりたい

続いてクラスを作成。

import java.io.InputStreamReader;
import java.io.Reader;
import java.util.Properties;

public class Main {

    public static void main(String[] args) throws Exception {

        Properties p = new Properties();
        Reader r = new InputStreamReader(Main.class.getResourceAsStream("hoge.txt"),"UTF-8");
        p.load(r);
        r.close();
        System.out.println( p.getProperty("星に願いを") );
    }
}


実行すると

年収300万の高級取りになりたい

と表示される。

native2asciiは一切使用していない。これ1.1のときに用意するべきだったよなぁ。


ちなみに便利なメソッドもJavaSE 6で追加された。

        for(String name : p.stringPropertyNames()){
            System.out.println(name);
        }

stringPropertyNamesでプロパティのキー名一覧が取得できる。今までも取得する方法はいくつかあったが、拡張forがつかえないEnumerationだったり、そもそもStringしか扱えないのに互換性のためにHashTableであることなどでObjectを取得するなどなんとも使いにくい状況だったのだ。

このメソッドが追加されたことでやっとStringでのプロパティアクセス(getPropertyとsetProperty)と一覧取得が出来るようになった。(setPropertyの戻り値は使うことはあんまりないけど、どうにかならなかったのかとは思ったけど、これも互換性のためなのがつらいところ。)HashTableのメソッド使ってる例をたまに見かけるけど、これはかなりオススメできないので注意されたし。