Home  Contents

Input & Output

This chapter is dedicated to Input & Output in Visual Basic. The Input & Output in Visual Basic is based on streams.

Streams are objects to work with Input/Output. A stream is an abstraction of a sequence of bytes, such as a file, an input/output device, an inter-process communication pipe, or a TCP/IP socket. In Visual Basic, we have a Stream class that is an abstract class for all streams. There are additional classes that derive from the Stream class and make the programming a lot easier.

MemoryStream

A MemoryStream is a stream which works with data in a computer memory.

Option Strict On


Imports System.IO

Module Example

   Sub Main()

      Dim ms As Stream = New MemoryStream(6)

      ms.WriteByte(9)
      ms.WriteByte(11)
      ms.WriteByte(6)
      ms.WriteByte(8)
      ms.WriteByte(3)
      ms.WriteByte(7)

      ms.Position = 0

      Dim rs As Integer
      rs = ms.ReadByte()

      Do While rs <> -1
        Console.WriteLine(rs)
        rs = ms.ReadByte()
      Loop

      ms.Close()

   End Sub 

End Module

We write six numbers to a memory with a MemoryStream. Then we read those numbers and print them to the console.

Dim ms As Stream = New MemoryStream(6)

The line creates and initializes a MemoryStream object with a capacity of six bytes.

ms.Position = 0

We set the position of the cursor in the stream to the beginning using the Position property.

ms.WriteByte(9)
ms.WriteByte(11)
ms.WriteByte(6)
...

The WriteByte() method writes a byte to the current stream at the current position.

Do While rs <> -1
  Console.WriteLine(rs)
  rs = ms.ReadByte()
Loop

Here we read all bytes from the stream and print them to the console.

ms.Close()

Finally, we close the stream.

$ ./memory.exe 
9
11
6
8
3
7

Output of the example.

StreamReader & StreamWriter

StreamReader reads characters from a byte stream. It defaults to UTF-8 encoding. StreamWriter writes characters to a stream in a particular encoding.

Option Strict On

Imports System.IO

Module Example

   Sub Main()

       Dim file As String
       file = "languages"
         
       Try
           Dim stream As StreamReader
           stream = New StreamReader(file)
           Console.WriteLine(stream.ReadToEnd())
       Catch e As IOException
           Console.WriteLine("Cannot read file.")
       End Try

   End Sub 

End Module

We have a file called languages. We read characters from that file and print them to the console.

Dim stream As StreamReader
stream = New StreamReader(file)

The StreamReader takes a file name as a parameter.

Console.WriteLine(stream.ReadToEnd())

The ReadToEnd() method reads all characters to the end of the stream.

$ cat languages 
Python
Visual Basic
PERL
Java
C
C#
$ ./readfile.exe 
Python
Visual Basic
PERL
Java
C
C#

We have a languages file in the current directory. We print all lines of the file to the console.

In the next example, we will be counting lines.

Option Strict On

Imports System.IO

Module Example

   Sub Main()

       Dim file As String
       Dim count As Integer

       file = "languages"
         
       Try
           Dim stream As StreamReader
           stream = New StreamReader(file)
              
           While Not (stream.ReadLine() Is Nothing)
               count += 1
           End While

       Catch e As IOException
           Console.WriteLine("Cannot read file.")
       End Try

       Console.WriteLine("There are {0} lines", count)

   End Sub 

End Module

Counting lines in a file.

While Not (stream.ReadLine() Is Nothing)
    count += 1
End While

In the While loop, we read a line from the stream with the ReadLine() method. It returns a line from the stream or Nothing if the end of the input stream is reached.

An example with StreamWriter follows.

Option Strict On

Imports System.IO

Module Example

   Sub Main()

      Dim mstream As New MemoryStream()
      Dim swriter As New StreamWriter(mstream)

      swriter.Write("ZetCode, tutorials for programmers.")
      swriter.Flush()
      
      Dim sreader As New StreamReader(mstream)
      Console.WriteLine(sreader.ReadToEnd())
      sreader.Close()

   End Sub 

End Module

In the preceding example, we write characters to the memory.

Dim mstream As New MemoryStream()

A MemoryStream is created.

Dim swriter As New StreamWriter(mstream)

A StreamWriter class takes a memory stream as a parameter. This way, we are going to write to memory stream.

swriter.Write("ZetCode, tutorials for programmers.")
swriter.Flush()

We write some text to the writer. The Flush() clears all buffers for the current writer and causes any buffered data to be written to the underlying stream.

Dim sreader As New StreamReader(mstream)
Console.WriteLine(sreader.ReadToEnd())

Now we create an instance of the stream reader and read everything we have written back.

FileStream

A FileStream class uses a stream on a file on the filesystem. This class can be used to read from files, write to files, open them and close them.

Option Strict On

Imports System.IO
Imports System.Text

Module Example

   Sub Main()
        Dim fstream As New FileStream("author", FileMode.Append)
        Dim bytes As Byte() = New UTF8Encoding().GetBytes("Фёдор Михайлович Достоевский")

        fstream.Write(bytes, 0, bytes.Length)
        fstream.Close()
   End Sub 

End Module

We write some text in Russian azbuka to the file in the current working directory.

Dim fstream As New FileStream("author", FileMode.Append)

A FileStream object is created. The second parameter is a mode, in which the file is opened. The append mode opens the file if it exists and seeks to the end of the file, or creates a new file.

Dim bytes As Byte() = New UTF8Encoding().GetBytes("Фёдор Михайлович Достоевский")

We create an array of bytes from text in Russian azbuka.

fstream.Write(bytes, 0, bytes.Length)

We write the bytes to the file stream.

XmlTextReader

We can use streams to read XML data. The XmlTextReader is the class to read XML files in Visual Basic. The class is forward-only and read-only.

We have the following XML test file.

<?xml version="1.0" encoding="utf-8" ?>
<languages>
    <language>Python</language>
    <language>Ruby</language>   
    <language>Javascript</language>
    <language>C#</language>
</languages>
Option Strict On

Imports System.IO
Imports System.Xml

Module Example

    Sub Main()

        Dim file As String
        file = "languages.xml"
      
        Try
            Dim xreader As New XmlTextReader(file)

            xreader.MoveToContent()

            Do While xreader.Read()
                Select Case xreader.NodeType
                    Case XmlNodeType.Element
                        Console.Write(xreader.Name & ": ")
                    Case XmlNodeType.Text
                        Console.WriteLine(xreader.Value)
                End Select
            Loop
 
            xreader.Close()
 
        Catch e As IOException
            Console.WriteLine("Cannot read file.")
        Catch e As XmlException
            Console.WriteLine("XML parse error")
        End Try

     End Sub 

End Module

This Visual Basic program reads data from the previously specified XML file and prints it to the terminal.

Dim xreader As New XmlTextReader(file)

An XmlTextReader object is created. It takes the file name as a parameter.

xreader.MoveToContent()

The MoveToContent() method moves to the actual content of the XML file.

Do While xreader.Read()

This line reads the next node from the stream.

Case XmlNodeType.Element
    Console.Write(xreader.Name & ": ")
Case XmlNodeType.Text
    Console.WriteLine(xreader.Value)

Here we print the element name and element text.

Catch e As XmlException
    Console.WriteLine("XML parse error")

We check for XML parse error.

$ ./readxml.exe 
language: Python
language: Ruby
language: Javascript
language: C#

Output of example.

Files and directories

The .NET framework provides other classes that we can use to work with files and directories.

A File class is a higher level class that has shared methods for file creation, deletion, copying, moving, and opening. These methods make the job easier.

Option Strict On

Imports System.IO

Module Example

    Sub Main()
       Try        
            Dim sw As StreamWriter

            sw = File.CreateText("cars")

            sw.WriteLine("Toyota")
            sw.WriteLine("Skoda")
            sw.WriteLine("BMW")
            sw.WriteLine("Volkswagen")
            sw.WriteLine("Volvo")

            sw.Close()
       Catch e As IOException
           Console.WriteLine("IO error")
       End Try

    End Sub

End Module

In the example, we create a cars file and write some car names into it.

sw = File.CreateText("cars")

The CreateText() method creates or opens a file for writing UTF-8 encoded text. It returns a StreamWriter object.

sw.WriteLine("Toyota")
sw.WriteLine("Skoda")
...

We write two lines to the stream.

Option Strict On

Imports System.IO

Module Example

    Sub Main()
                
        If File.Exists("cars")
            Console.WriteLine(File.GetCreationTime("cars"))
            Console.WriteLine(File.GetLastWriteTime("cars"))
            Console.WriteLine(File.GetLastAccessTime("cars"))
        End If

        File.Copy("cars", "newcars")

    End Sub

End Module

In the second example, we show other five shared methods of the File class.

If File.Exists("cars")

The Exists() method determines whether the specified file exists.

Console.WriteLine(File.GetCreationTime("cars"))
Console.WriteLine(File.GetLastWriteTime("cars"))
Console.WriteLine(File.GetLastAccessTime("cars"))

We get creation time, last write time and last access time of the specified file.

File.Copy("cars", "newcars")

The Copy() method copies the file.

The My.Computer.FileSystem is and object, which provides properties and methods for working with drives, files, and directories.

Option Strict On

Imports System.IO

Module Example

    Sub Main()

        Try
            My.Computer.FileSystem.CreateDirectory("temp")
            My.Computer.FileSystem.CreateDirectory("newdir")
            My.Computer.FileSystem.MoveDirectory("temp", "temporary")
        Catch e As IOException
            Console.WriteLine("Cannot create directories")
            Console.WriteLine(e.Message)
        End Try

    End Sub

End Module

We will use two methods from the above mentioned object.

My.Computer.FileSystem.CreateDirectory("temp")

The CreateDirectory() method creates a new directory.

My.Computer.FileSystem.MoveDirectory("temp", "temporary")

The MoveDirectory() method gives a specified directory a new name.

The DirectoryInfo and Directory have methods for creating, moving, and enumerating through directories and subdirectories.

Option Strict On

Imports System.IO

Module Example

    Dim subDir As IO.DirectoryInfo
    Dim dir As New IO.DirectoryInfo("../io")

    Dim fileName As String

    Dim files As String() = Directory.GetFiles("../io")
    Dim dirs As DirectoryInfo() = dir.GetDirectories()

    Sub Main()
                
        For Each subDir In dirs
            Console.WriteLine(subDir.Name)
        Next
                
        For Each fileName In files
            Console.WriteLine(fileName)
        Next 

    End Sub

End Module

We use the DirectoryInfo class to traverse a specific directory and print its contents.

Dim dir As New IO.DirectoryInfo("../io")

We will show the contents of this directory (io).

Dim files As String() = Directory.GetFiles("../io")

We get all files of the io directory using the shared GetFiles() method.

Dim dirs As DirectoryInfo() = dir.GetDirectories()

We get all directories.

For Each subDir In dirs
    Console.WriteLine(subDir.Name)
Next

Here we loop through directories and print their names to the console.

For Each fileName In files
    Console.WriteLine(fileName)
Next 

Here we loop through the array of files and print their names to the console.

$ ./showcontents.exe 
newdir
temp
temporary
../io/append.exe
../io/append.vb
../io/append.vb~
../io/author
../io/cars
...

Output of the example.

In this chapter, we have covered Input/Output operations in Visual Basic.