GZipStreamなど他のストリームのラッパーとして動作するストリームの場合、そのストリームを閉じる際にベースとなったストリームも一緒に閉じるかどうかを指定することができるものがあります。 コンストラクタの引数leaveOpenにtrueを指定すると、Closeメソッドを呼び出したりusingステートメントから抜けてストリームを閉じた場合でも、ベースとなったストリームは開いたままになります。
次の例では、GZipStreamを使ってメモリ上で圧縮・展開を行なっていますが、圧縮と展開で同じMemoryStreamを使えるようleaveOpenにtrueを指定してGZipStreamを作成しています。
ラッパーとなるストリームを閉じる際にベースとなったストリームを開いたままにする
Imports System
Imports System.IO
Class Sample
Shared Sub Main()
Using fromStream As Stream = File.OpenRead("sample.dat")
Using toStream As New MemoryStream()
' ファイルの内容をMemoryStreamにコピー
fromStream.CopyTo(toStream)
' コピーした内容をバイト配列に変換して表示
Console.WriteLine(BitConverter.ToString(toStream.ToArray()))
End Using
End Using
End Sub
End Class
なお、StreamReader・StreamWriterやBinaryReader・BinaryWriterでもベースとなったストリームを開いたままにするかどうかを指定することができます。