JavaなどのプログラムでXMLファイルを扱う際、「文字で書かれているのだからReaderで読むべきではないのか」「なぜInputStreamを使うのか」と疑問に感じることがあります。XMLは確かに人間が読むことのできるテキスト形式ですが、実際のプログラム処理では文字データとして扱う場合とバイトデータとして扱う場合があり、目的によって適切な読み込み方法が変わります。
この記事では、XMLファイルをInputStreamで読み込む理由、Readerとの違い、XML処理でどのように使い分けるべきかを初心者にも分かりやすく解説します。
XMLは文字データなのになぜInputStreamで読むのか
XMLファイルは基本的にはテキストファイルです。そのため、単純に内容を文字として読み取るだけならReaderを利用することができます。
しかし、XML処理ライブラリの多くはInputStreamを受け取る形式のAPIを用意しています。これはXMLの内容を解析する前に、ファイルそのものの情報を確認する必要があるためです。
例えばXMLには、以下のような宣言が含まれる場合があります。
<?xml version=”1.0″ encoding=”UTF-8″?>
このencoding(文字コード)情報を正しく処理するには、最初から文字列として読み込むよりも、元のバイトデータとして取得したほうが安全です。
InputStreamとReaderの基本的な違い
InputStreamとReaderの大きな違いは、扱うデータの単位です。
| 種類 | 扱うデータ | 用途 |
|---|---|---|
| InputStream | バイト | 画像、音声、ファイル、XMLなどの元データ読み込み |
| Reader | 文字 | テキスト文章の読み込み |
InputStreamは0と1のバイト列をそのまま扱います。一方、Readerは文字コードを解釈して文字として扱います。
例えばUTF-8で保存されたXMLをReaderで読む場合、Reader側で正しい文字コードを指定しなければ文字化けする可能性があります。
XML解析ではInputStreamが便利な理由
XML解析ライブラリでは、ファイルの文字コードをXML自身に判断させるためにInputStreamがよく利用されます。
例えばJavaのSAXParserやDocumentBuilderでは、以下のようにInputStreamを渡すことができます。
FileInputStream stream = new FileInputStream(“sample.xml”);
この場合、XMLパーサーはファイル内部のXML宣言を確認し、適切な文字コードで解析できます。
もし先にReaderへ変換してしまうと、その時点で文字コードの解釈が完了してしまいます。そのため、XMLが指定している文字コード情報を利用できなくなる場合があります。
Readerを使ってXMLを読むケース
もちろんXMLをReaderで扱うことが間違いというわけではありません。文字コードが明確で、自分で文字列として処理したい場合にはReaderが適しています。
例えば、XMLファイルの内容を単純に表示したり、特定の文字列を検索したりするだけならReaderでも問題ありません。
例として、UTF-8であることが保証されたXMLなら以下のような処理が可能です。
FileReaderやInputStreamReaderを利用してXMLの内容を文字列として読み込み、その後独自処理を行う方法です。
ただし、XML解析を目的とする場合は、一般的にはInputStreamを直接渡すほうが安全です。
XML処理でのInputStreamとReaderの使い分け
どちらを使うべきかは、XMLを何のために読むのかによって決まります。
| 目的 | おすすめ |
|---|---|
| XMLパーサーで解析する | InputStream |
| XMLを文字列として加工する | Reader |
| XMLの文字コード情報を保持したい | InputStream |
| 内容を画面表示するだけ | Reader |
実務では、XMLを読み込んでデータとして利用する場合はInputStream、XMLそのものを文章として扱う場合はReaderという考え方をすると分かりやすくなります。
まとめ
XMLは文字で書かれたデータですが、XML解析ではInputStreamがよく利用されます。理由は、XML内部の文字コード情報を含めて正しく解析するためです。
Readerは文字を扱うための仕組みであり、すでに文字コードが確定している場合には便利ですが、XMLパーサーへ渡す場合はInputStreamを利用するほうが安全なケースが多くあります。
XMLを扱う際は「XMLだから必ずReader」という考え方ではなく、解析するのか、文字として加工するのかという目的に合わせてInputStreamとReaderを使い分けることが重要です。


コメント