Hatena::ブログ(Diary)

しんさんの出張所 はてな編 このページをアンテナに追加 RSSフィード

カレンダー
2007 | 12 |
2008 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2009 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2010 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2011 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2012 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2013 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 11 | 12 |
2014 | 01 | 02 | 03 | 04 | 05 | 06 | 08 | 09 | 10 | 11 | 12 |
2015 | 02 | 03 | 04 | 05 | 06 | 07 | 09 | 10 | 11 |
2016 | 05 | 08 | 10 | 11 | 12 |
2017 | 01 | 02 | 06 | 08 |

2009-07-07

[][]第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,Object>であることなどでObjectを取得するなどなんとも使いにくい状況だったのだ。

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

kensir0ukensir0u 2009/07/10 19:22 これってResourceBundle が対応してなかったので、あんまり使えないやと思ってたんですが、そのあたりも対応されたのですかね?

shinshin 2009/07/10 22:05 まず、JavaSE6からはPropertyResourceBundleのコンストラクタにReaderのものが追加されています。今まではInputStreamしかありませんでしたのでエスケープが必要でした。

もうひとつ、java.util.ResourceBundle.Controlというクラスが新設されています。これを使えばもはや、リソースは従来のリソースファイル形式とリソースクラスである必要がありません。たとえばCSV形式をリソースバンドルとして扱うようなカスタマイズが出来るようになっています。JavaDocのサンプルコードではXMLをリソースバンドルにするコードが書かれていますね。

つまりPOI使えばExcelファイルを直接使えるのです。hoge.xlsがデフォルトでhoge_ja_JP.xlsが日本語だということも可能になりました。ためしにサンプルコード用意してもいいですよ。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

リンク元