Hey! If you love C# and building C# apps as much as I do, let's connect on Twitter or LinkedIn. I talk about this stuff all the time!

Streams and IO in C#: A Developer’s Guide

Unlock the power of streams and IO in C#! Learn how to work with input and output streams, read and write data, and handle errors like a pro. Boost your coding skills today!


Updated October 18, 2023

In this article, we’ll explore the basics of streams and input/output (IO) operations in C#. We’ll cover the different types of streams, how to work with them, and best practices for using IO operations in your C# applications.

Understanding Streams

In C#, a stream is a sequence of data that can be read from or written to. There are several types of streams, including:

FileStream

A FileStream is a stream that reads and writes data from a file on disk. You can use a FileStream to read and write files in both binary and text modes.

using (FileStream fileStream = new FileStream("example.txt", FileMode.Open))
{
    // Read from the stream
    string line;
    while ((line = fileStream.ReadLine()) != null)
    {
        Console.WriteLine(line);
    }
}

NetworkStream

A NetworkStream is a stream that reads and writes data over a network connection. You can use a NetworkStream to send and receive data between clients and servers.

using (NetworkStream networkStream = new NetworkStream(new Socket("localhost", 8080)))
{
    // Read from the stream
    byte[] buffer = new byte[1024];
    int bytesRead = networkStream.Read(buffer, 0, buffer.Length);
    Console.WriteLine("Received {0} bytes.", bytesRead);

    // Write to the stream
    string message = "Hello, client!";
    networkStream.Write(Encoding.ASCII.GetBytes(message));
}

MemoryStream

A MemoryStream is a stream that stores data in memory. You can use a MemoryStream to temporarily store data before it’s written to disk or sent over the network.

using (MemoryStream memoryStream = new MemoryStream())
{
    // Write to the stream
    byte[] data = { 0x1, 0x2, 0x3 };
    memoryStream.Write(data, 0, data.Length);

    // Read from the stream
    byte[] buffer = new byte[4];
    int bytesRead = memoryStream.Read(buffer, 0, buffer.Length);
    Console.WriteLine("Read {0} bytes.", bytesRead);
}

Working with IO Operations

When working with streams and IO operations in C#, there are several best practices you should follow:

Use the using statement

The using statement is a syntax sugar that automatically closes and disposes of a stream or other disposable object when it goes out of scope. It’s a great way to ensure that resources are properly cleaned up after use.

using (FileStream fileStream = new FileStream("example.txt", FileMode.Open))
{
    // Read from the stream
    string line;
    while ((line = fileStream.ReadLine()) != null)
    {
        Console.WriteLine(line);
    }
}

Use try-catch blocks

IO operations can sometimes fail, so it’s important to handle exceptions gracefully. Use try-catch blocks to catch and handle any exceptions that may occur during IO operations.

try
{
    // Perform an IO operation
    FileStream fileStream = new FileStream("example.txt", FileMode.Open);
}
catch (IOException ex)
{
    Console.WriteLine("An exception occurred: {0}", ex.Message);
}

Use the Flush method

The Flush method is used to write any pending data to the underlying stream. It’s important to call Flush after you’ve written data to a stream to ensure that the data is actually written to disk or memory.

using (FileStream fileStream = new FileStream("example.txt", FileMode.Create))
{
    // Write data to the stream
    string line;
    while ((line = Console.ReadLine()) != null)
    {
        fileStream.Write(line);
        fileStream.Flush();
    }
}

Conclusion

In this article, we’ve covered the basics of streams and IO operations in C#. We’ve looked at the different types of streams, how to work with them, and best practices for using IO operations in your C# applications. By following these guidelines, you can ensure that your C# applications are robust, reliable, and efficient when it comes to working with data.