連載プロフェッショナルVB.NETプログラミング
|
.NET Frameworkクラス・ライブラリを用いたテキスト・ファイルの入出力
前回の記事で、VB.NET(Visual Basic .NET)でファイル入出力を行う方法として、入出力ステートメント(VB.NETではVB専用関数)を用いる方法と、ファイル・システム・オブジェクトを使用する方法をご紹介したが、それとは別に、.NET Frameworkのクラス・ライブラリを用いる方法がある。さっそく、前回と同じような内容を、これを用いて記述した例を以下に示す。
|
|
.NET Frameworkのクラス・ライブラリを用いてファイル入出力を行うVB.NETのサンプル・プログラム1 |
これを実行すると以下のようになる。
|
|
サンプル・プログラム1の実行結果 |
ソース・コードを説明しよう。まず、1行目で、「Imports System.IO」としているのは、クラス・ライブラリにある多数のクラスの中で、“System.IO”という名前空間に属するクラスを、前置きなしにソース中に記述するという意図を指示するものである。このような記述を行わなくても、クラス名として名前空間を含むフルネームを記述すれば利用できるのだが、そうすると名前が長くなりすぎてソースが見にくくなるので、このような機能を利用することが多い。
さて、実際に、この名前空間に含まれているStreamWriterクラスと、StreamReaderクラスをこのソースでは利用している。この2つは、9行目のDim文で普通のVB.NETのクラスのように利用しているが、クラス・ライブラリ内のクラスも、VB.NETで記述したクラスも、機能的に同等なので、同じようなものとして扱って問題ない。
StreamWriterクラスは、ファイルなどにテキスト・データを出力するために使用される。StreamReaderクラスはファイルなどからテキスト・データを入力するために使用される。どちらもオブジェクトをNewキーワードで生成するときに、ファイル名を指定してやると、それを対象として機能する。Newキーワードで生成するときにはほかにも多くの指定が可能だが、ここでは説明を割愛する。そして、StreamWriterクラスは、データを文字列として出力するWriteメソッドと出力後に改行するWriteLineメソッドなどを持つ。SreamReaderクラスは、テキスト・ファイルから1行入力するReadLineメソッドなどを持つ。どちらのクラスもファイルを閉じるCloseメソッドも持っている。これらを使うことで、テキスト・ファイルの入出力が実現できる。
若干補足すると、WriteとWriteLineメソッドは、任意のオブジェクトを引数に記述できるが、これらは自動的に文字列に変換されて出力される。ReadLineメソッドは、ファイルの最後を越えて読み出そうとすると、Nothing値を返してくるので、これでファイルの末尾を判定することができる。
さて、実行結果を見ると、うまく動作しているように見える。だが、このプログラムが作成したデータ・ファイルをテキスト・エディタ(秀丸など)で開いてみると、そんな単純な話ではないことが分かるだろう。以下は秀丸で開いてみた場合である(設定によってはこれと異なる結果になる可能性もある)。
サンプル・プログラム1が出力したデータ・ファイルをテキスト・エディタで開いた例 |
見てのとおり、日本語の文字がすべて化けてしまっている。その理由は、.NET Frameworkのクラス・ライブラリでは、何も指定しなければ自動的に文字エンコーディングとして、「UTF-8」が使用されるという仕様による。従来のVB 6(Visual Basic 6.0)や、VB.NETのVB専用関数、ファイル・システム・オブジェクトなどは、何も指定しなければ、その環境のデフォルト、日本では通常「シフトJIS」を使用することになっている。
日本では、文字は何もかもシフトJISで記述されていると思い込んでいるプログラマーも多いが、実際には世の中に多くの種類の表現方法(エンコーディング)が存在し、それらは相互に互換性がない。そして、そのような互換性のない多くの方法が存在することはデメリットが大きいため、インターネットを中心にUTF-8に統一していこうという動きがある。.NET Frameworkは、まさにその最も先進的な動きを自ら取り込んだ新しいソフトであるため、デフォルトはUTF-8となっている。
シフトJISの時代には、日本語対応のパソコンで作成したデータを他国に持っていくと文字化けしてしまうという事態も起きたが、UTF-8を用いれば、日本語フォントがないため表示できない事態はあるかもしれないが、文字の種類を誤って判断されることはなくなるため、システムが別の文字と誤認する危険はなくなる。
このことから当然予測できるように、秀丸のようなテキスト・エディタでこのファイルを正しく開くには、文字コードとしてUTF-8を指定して開けばよい。
文字コードとして“UTF-8”を指定してデータ・ファイルを開いた例 |
これからは、UTF-8が主流になっていくことは間違いなく、VB.NETで記述されたアプリケーション・ソフトによって出力されるファイルがUTF-8で記述されていることも珍しくはなくなるだろう。
UTF-8のことを詳しく知りたいという方には、以下の本を推薦しておく。
『Unicode標準入門』
Tony Graham著/関口正裕 監修/乾和志、海老塚徹 訳、翔泳社発行、ISBN4-7981-0030-7、3800円
INDEX | ||
連載 プロフェッショナルVB.NETプログラミング | ||
第8回 ファイル入出力(後編) | ||
1..NET Frameworkクラス・ライブラリを用いたテキスト・ファイルの入出力 | ||
2.エンコーディング名を指定したテキスト・ファイルの入出力 | ||
3.テキスト・ファイルの書き込み位置 | ||
「プロフェッショナルVB.NETプログラミング」 |
- 第2回 簡潔なコーディングのために (2017/7/26)
ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている - 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう - 第1回 明瞭なコーディングのために (2017/7/19)
C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える - Presentation Translator (2017/7/18)
Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
|
|