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