Streamはその種類やコンストラクタでの設定によって書き込み可能か、読み込み可能か異なります。 Streamが書き込み可能かどうかといったケーパビリティを実行時に知るには、CanReadCanWriteCanSeekの各プロパティを参照します。

次の例は、様々な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の取得については自プロセスの標準入出力 §.標準ストリームの取得で詳しく解説しています。