Streamクラスにはヌルオブジェクトを取得するプロパティStream.Nullが用意されています。 Stream.Nullは、NULLデバイス(nul・/dev/null)の代わりとして使ったり、テスト時に具体的なStreamを用意する代わりにモックとして使用したりすることができます。
Stream.Nullは読み込み・書き込み・シークなど全ての機能をサポートしますが、実際にそれらの操作を行なっても何も起こりません。 Stream.Nullに対してWriteメソッドで書き込んだ内容はすべて破棄され、ReadメソッドでStream.Nullから読み込みを行った場合は0バイトのデータが読み出されます。 Stream.Nullの長さ(Length)は常に0です。
次の例では、出力先をStream.Nullに設定したStreamWriterをConsole.SetOutメソッド渡すことによって標準出力の出力先をコンソールからStream.Nullに変更(リダイレクト)し、Console.WriteLineメソッドで出力される内容を破棄しています。
Stream.Nullを使ってConsole.WriteLineメソッドで出力される内容を破棄する
Imports System
Imports System.IO
Class Sample
Shared Sub Main(ByVal args() As String)
For Each arg As String In args
' オプションスイッチ/quietが指定された場合は、標準出力へのメッセージ出力を抑止する
If arg = "/quiet" Then
' 標準出力の出力先をStream.Nullに設定したStreamWriterに変更する
Console.SetOut(New StreamWriter(Stream.Null))
' 次のようにTextWriter.Nullを使うことも可能
' Console.SetOut(TextWriter.Null)
End If
Next
' 警告メッセージを標準出力に出力
Console.WriteLine("warning")
' 致命的なエラーメッセージを標準エラーに出力
Console.Error.WriteLine("FATAL ERROR")
End Sub
End Class
実行結果
D:\test> Sample.exe warning FATAL ERROR D:\test> Sample.exe /quiet FATAL ERROR
標準出力のリダイレクトについては自プロセスの標準入出力 §.標準ストリームのリダイレクトで詳しく解説しています。