コンソールアプリの「呼吸」を整える:StreamReader/Writerによる確実な入出力術
こんにちは。現場で泥臭い自動化を積み重ね、いつしかシステムという巨大な機械のアーキテクトになった私が、今日は君たちに「プログラムの呼吸」について話をしよう。
VBAの「マクロの記録」から一歩踏み出し、Visual Basic (VB.NET) という本格的な武器を手にした君たちへ。コンソールアプリケーションは、いわば「黒い画面」との対話だ。ここで入出力を正しく制御できるかどうかは、君が書いたプログラムが「ただ動くだけの玩具」になるか、「現場を支える堅牢なツール」になるかの分かれ道だ。
今日は、最も基本的であり、かつ最も重要な「StreamReader」と「StreamWriter」による入出力の極意を伝授する。
—
1. なぜ「Console.ReadLine」だけでは不十分なのか?
初心者の多くは `Console.ReadLine()` で入力を受け取り、結果を画面に出力して終わりにする。だが、実際の業務ではどうだ? 処理結果はログファイルとして保存しなければならないし、膨大なデータを読み込ませることもある。
ここで登場するのがストリーム(Stream)という概念だ。
ストリームとは、データが流れる「管(パイプ)」のこと。`StreamReader` は管からデータを取り出し、`StreamWriter` は管にデータを流し込む。この「管」を意識するだけで、君のコードの質は劇的に向上する。
—
2. 確実に書き出すための「StreamWriter」レシピ
まずは、処理結果を安全にファイルへ書き出すコードを見てみよう。ここで重要なのは、「使い終わったら確実に閉じる(解放する)」ということだ。
Imports System.IO
Module Program
Sub Main()
Dim logPath As String = “process_log.txt”
‘ Usingブロックを使うのがエンジニアの流儀。
‘ これにより、処理が終わった瞬間にメモリが解放され、ファイルも安全に閉じられる。
Using writer As New StreamWriter(logPath, append:=True)
writer.WriteLine($”[{DateTime.Now}] 処理を開始しました。”)
Try
‘ ここにメインの処理が入る
Dim result As Integer = 100 / 2
writer.WriteLine($”[{DateTime.Now}] 成功: 結果は {result} です。”)
Catch ex As Exception
‘ エラーが発生した時こそ、ログの真価が問われる
writer.WriteLine($”[{DateTime.Now}] エラー発生: {ex.Message}”)
End Try
End Using ‘ ここで自動的にDisposeが呼ばれ、リソースがクリーンになる
Console.WriteLine(“ログの書き出しが完了しました。”)
End Sub
End Module
ここがプロのポイント!
- `Using` ステートメント: これを使わないコードは、メモリリーク(メモリの食い逃げ)の温床だ。VB.NETでは `Using` を使うだけで、例外が発生しても確実にファイルを閉じてくれる。
- `append:=True`: これを忘れると、毎回ファイルが上書きされて過去のログが消える。「追記モード」はログ出力の基本中の基本だ。
—
3. 「StreamReader」で巨大なデータも安全に読み込む
次に、外部ファイルから設定値を読み込む場合だ。全部を一度に読み込むとメモリを圧迫するが、ストリームなら一行ずつ処理できる。
Using reader As New StreamReader(“config.txt”)
While Not reader.EndOfStream
Dim line As String = reader.ReadLine()
‘ ここで読み込んだ一行を処理する
Console.WriteLine($”読み込み中…: {line}”)
End While
End Using
—
4. 初学者が陥る「3つの罠」
現場でよく見る「動くけれどダメなコード」の特徴を挙げておこう。これを避けるだけで、君は一歩抜きん出た存在になれる。
1. 例外処理を無視する: `Try…Catch` を書かないコードは、爆弾を抱えて走っているようなものだ。予期せぬ入力(空文字や不正な形式)で即座にクラッシュさせてはいけない。
2. リソースの解放忘れ: `File.Open` を連発して `Close` を忘れると、プログラムがファイルを掴んだまま離さず、他のツールがそのファイルを開けなくなる。`Using` を使えば解決だ。
3. パスの直書き: `C:\Users\Name\…` のように書くと、他人のPCで動かなくなる。プログラムと同じフォルダに置くなら `AppDomain.CurrentDomain.BaseDirectory` を活用しよう。
—
最後に:君のコードを「作品」にするために
コンソールアプリの標準入出力は、地味かもしれない。しかし、これこそがシステム開発の「血流」なんだ。
画面に文字を出すだけでなく、背後で静かにログを刻み、必要な情報を正しく吸い上げる。そんな「静かなる堅牢性」を持つプログラムを書けるようになった時、君はもう初心者ではない。
まずはこのコードをコピーして、自分の手で実行してみてほしい。そこから見える景色が、今までとは少し違っているはずだ。
何か詰まったら、いつでも戻ってきなさい。次のステップへ進むための準備は、いつでもできているよ。
