さて問題。 次のうち正しいのはどれ?
java.io パッケージには InputStreamReader というクラスがあるので、Reader を使うように統一しておけば簡単なようにも思いますが、実際には(いくつかの例外を除いて)XML 文書を読み込むのには InputStream を使う方べきであるというのが正解です。
InputStream と Reader は何が違う?
「XML 文書を読み込むのには InputStream を使う方べきである」理由は、InputStream と Reader とは何が違うかというところからきています。 ではまた問題。 次のうち正しいのはどれ?
- InputStream より Reader の方が優れている。 InputStream は互換性や C 系言語の名残である
- Reader より InputStream の方が優れている。 Reader は互換性や C 系言語の名残である
- InputStream も Reader も大差ない
- InputStream と Reader には次のような違いがある:
- InputStream は入力を byte で読み込み、それが何の文字かには関知感知しない。 文字のエンコーディングは(もし必要なら) InputStream を使用する側が指定できる
- Reader は入力を char として読み込み、文字のエンコーディングは Reader インスタンスを作成した際に決定される。 このエンコーディングは Reader を使用する側では変更できない
ヒントは、「XML 文書は文書内にエンコーディング指定がしてあるので、読み込み側がエンコーディングを指定したい」ということです。
答えは問題文を見れば言うまでもないかな。
Reader から読み込む場合
では XML 文書の読み込みに Reader は必要ないか?と言われるとそうでもなくて、「内容が XML 文書の String オブジェクトから XML 文書を読み込む」ときには InputStream を使いようがなくて、java.io.StringReader を使って読み込みを実行します*1。
ライブラリ
JAXP を見ていると org.xml.sax.InputSource (SAX) や javax.xml.stream.InputFactory (StAX) では InputStream も Reader もサポートされてますが、javax.xml.parsers.SAXParser (SAX), javax.xml.parsers.DocumentBuilder (DOM) では InputStream しかサポートされてないようです(InputSource を介せば Reader も使えますが)。
また、StAX の javax.xml.XMLStreamReader では実際のエンコーディングと XML 文書に指定されているエンコーディングを別々に取得できるように
- getEncoding()
- getCharacterEncodingScheme()
という2つの似たようなメソッドが定義されています。
ちなみに上記の InputStream/Reader の話は OutputStream/Writer の話にも通じますが、 Groovy の groovy.xml.MarkupBuilder では「Writer は使えるけど OutputStream は使えない」という妙な使用になってます。
- 作者: Brett McLaughlin,須賀祐治,寺田美穂子
- 出版社/メーカー: オライリー・ジャパン
- 発売日: 2002/05
- メディア: 単行本
- 購入: 1人 クリック: 5回
- この商品を含むブログ (13件) を見る
- 作者: エリック・T・レイ,Erik T.Ray,宮下尚,牧野聡,立堀道昭
- 出版社/メーカー: オライリージャパン
- 発売日: 2004/06
- メディア: 単行本
- 購入: 3人 クリック: 62回
- この商品を含むブログ (21件) を見る