Streamはその種類やコンストラクタでの設定によって書き込み可能か、読み込み可能か異なります。 Streamが書き込み可能かどうかといったケーパビリティを実行時に知るには、CanRead・CanWrite・CanSeekの各プロパティを参照します。
次の例は、様々なStreamに対してそのケーパビリティを調べた例です。
ストリームが読み込み可能・書き込み可能・シーク可能か調べる
Imports System
Imports System.IO
Class Sample
Shared Sub PrintStreamCapability(ByVal stream As Stream)
Console.WriteLine("CanRead : {0}", stream.CanRead)
Console.WriteLine("CanWrite : {0}", stream.CanWrite)
Console.WriteLine("CanSeek : {0}", stream.CanSeek)
End Sub
Shared Sub Main()
' 読み込み用に開いたFileStream
Console.WriteLine("[File.OpenRead]")
Using stream As Stream = File.OpenRead("sample.dat")
PrintStreamCapability(stream)
End Using
' 書き込み用に開いたFileStream
Console.WriteLine("[File.OpenWrite]")
Using stream As Stream = File.OpenWrite("sample.dat")
PrintStreamCapability(stream)
End Using
' 書き込み可能なMemoryStream
Console.WriteLine("[MemoryStream]")
Using stream As Stream = New MemoryStream()
PrintStreamCapability(stream)
End Using
' 読み込み専用のMemoryStream
Console.WriteLine("[MemoryStream (read only)]")
Using stream As Stream = New MemoryStream(New Byte(7) {}, False)
PrintStreamCapability(stream)
End Using
' 標準入力のStream
Console.WriteLine("[Console.OpenStandardInput]")
Using stream As Stream = Console.OpenStandardInput()
PrintStreamCapability(stream)
End Using
' 標準出力のStream
Console.WriteLine("[Console.OpenStandardOutput]")
Using stream As Stream = Console.OpenStandardOutput()
PrintStreamCapability(stream)
End Using
End Sub
End Class
実行結果
[File.OpenRead] CanRead : True CanWrite : False CanSeek : True [File.OpenWrite] CanRead : False CanWrite : True CanSeek : True [MemoryStream] CanRead : True CanWrite : True CanSeek : True [MemoryStream (read only)] CanRead : True CanWrite : False CanSeek : True [Console.OpenStandardInput] CanRead : True CanWrite : False CanSeek : False [Console.OpenStandardOutput] CanRead : False CanWrite : True CanSeek : False
各ケーパビリティと、該当する操作のメソッド・プロパティは次のとおりです。
ケーパビリティのプロパティ | 該当するStreamの操作 |
---|---|
CanWrite | Write, WriteByte, Flush, SetLength |
CanRead | Read, ReadByte |
CanSeek | Seek, SetLength, Position(プロパティの設定) |
ケーパビリティがfalse
になっている操作を行おうとすると、例外NotSupportedExceptionがスローされます。 例えば、CanSeekがfalse
のStreamに対してSeekメソッドやSetLengthメソッドを呼び出そうとすると例外エラーとなります。
上記の例で使用している標準入力・標準出力のStreamの取得については自プロセスの標準入出力 §.標準ストリームの取得で詳しく解説しています。