FileStream in C# Explained
FileStream
in system.io
namespace provides a Stream
for
a file, supporting both synchronous and asynchronous read and write operations.
A stream is a flow of data from a source into a destination. The source or
destination can be a disk, memory, socket, or other programs.
When we use FileStream
,
we work with bytes. For more convenient work with text data, we can use StreamWriter
and StreamReader
.
Writing text using FileStream in C#
In the following example, we
write text data into a file with FileStream
.
using System;
using System.IO;
using System.Text;
namespace WriteText
{
class Program
{
static void Main(string[] args)
{
var fileName = @"C:\Users\Csharpnaija\Documents\words.txt";
using FileStream fs = File.OpenWrite(fileName);
var data = "falcon\nhawk\nforest\ncloud\nsky";
byte[] bytes = Encoding.UTF8.GetBytes(data);
fs.Write(bytes, 0, bytes.Length);
}
}
}
The example above
writes a couple of words into a text file.
using
FileStream fs = File.OpenWrite(fileName);
The File.OpenWrite()
method opens a FileStream
in a writing
mode.
var data = "falcon\nhawk\nforest\ncloud\nsky";
byte[] bytes = Encoding.UTF8.GetBytes(data);
We have text data which
we transform into bytes with Encoding.UTF8.GetBytes()
.
fs.Write(bytes, 0,
bytes.Length);
The bytes are written to
the FileStream
with Write()
.
Writing text using FileStream and StreamWriter in C#
In the following example, we
use FileStream
in combination with StreamWriter
.
using System;
using System.IO;
namespace CsharpnaijaTutorial
{
class Program
{
static void Main(string[] args)
{
var fileName = @"C:\Users\Csharpnaija\Documents\words.txt";
using FileStream fs = File.Create(fileName);
using var sr = new StreamWriter(fs);
sr.WriteLine("coin\nfalcon\nhawk\nforest");
Console.WriteLine("done");
}
}
}
The example above writes
text data into a file. For convenience, we use the StreamWriter
, which writes
characters to a stream in a particular encoding.
using FileStream fs = File.Create(fileName);
using var sr = new StreamWriter(fs);
As can be seen above, a FileStream is created that takes filename as a parameter
and StreamWriter
is created; it takes the FileStream
as a
parameter.
sr.WriteLine("coin\nfalcon\nhawk\nforest");
A line of text is written
to the FileStream
with WriteLine
() method of
StreamWriter
class
.
Reading text using FileStream in C#
In the following example, we read
data from a text file with FileStream
.
using System;
using System.IO;
using System.Text;
namespace ReadText
{
class Program
{
static void Main(string[] args)
{
var fileName = @"C:\Users\Csharpnaija\Documents\words.txt";
using FileStream fs = File.OpenRead(fileName);
byte[] buf = new byte[1024];
int c;
while ((c = fs.Read(buf, 0, buf.Length)) > 0)
{
Console.WriteLine(Encoding.UTF8.GetString(buf, 0, c));
}
}
}
}
The above example reads a
text file and prints its contents. We read the data as bytes, transform them
into strings using UTF8 encoding and finally, write the strings to the console.
With File
.
OpenRead
()
we open a
file for reading. The method returns a FileStream
.
byte[] buf = new byte[1024];
The buf
is a byte
array into
which we read the data from the file.
while ((c = fs.Read(buf, 0, buf.Length)) > 0)
{
Console.WriteLine(Encoding.UTF8.GetString(buf,
0, c));
}
The FileStream's
Read
()
method reads a block of bytes from the stream and
writes the data in a given buffer. The first argument is the byte offset in
array at which the read bytes will be placed. The second is the maximum number
of bytes to read. The Encoding
.
UTF8
.
GetString
()
decodes all
the bytes in the specified byte array into a string.
Reading text using FileStream with StreamReader in C#
In the following example, we
use FileStream
in
combination with StreamReader
.
using System;
using System.IO;
namespace csharpnaijaTutorial
{
class Program
{
static void Main(string[] args)
{
var fileName = @"C:\Users\csharpnaija\Documents\words.txt";
using FileStream fs = File.OpenRead(fileName);
using var sr = new StreamReader(fs);
string line;
while ((line = sr.ReadLine()) != null)
{
Console.WriteLine(line);
}
}
}
}
In the example
above, we read a text file. When we use StreamReader
, we do not need to do the decoding of bytes into characters.
using FileStream fs = File.OpenRead(fileName);
using var sr = new StreamReader(fs);
From
the above code snippet, we pass the FileStream
to the StreamReader
. If we do not
explicitly specify the encoding, the default UTF8 is used.
string line;
while ((line = sr.ReadLine()) != null)
{
Console.WriteLine(line);
}
We
read the data with the StreamReader's
WriteLine
()
method. It
returns the next line from the input stream, or null
if the end of
the input stream is reached.
Downloading Image Using FileStream in C#
In the following example, we
download a small image file.
using System;
using System.IO;
using System.Net.Http;
using System.Threading.Tasks;
namespace csharpnaijaTutorial
{
class Program
{
static async Task
Main(string[] args)
{
using var
httpClient = new
HttpClient();
var url = "http://webcode.me/favicon.ico";
byte[] imageBytes = await httpClient.GetByteArrayAsync(url);
fs.Write(imageBytes, 0,
imageBytes.Length);
}
}
}
The
example uses the HttpClient
to download a
small image file. The image is retrieved as an array of bytes. The bytes are
then written to a FileStream
.
fs.Write(imageBytes,
0, imageBytes.Length);
We
created a new file for writing. The bytes are written to the newly created file
with the Write
()
method.
Reading Image using FileStream in C#
In the next example, we read an
image file. We output the file as hexadecimal data.
using System;
using System.IO;
namespace csharpnaijaTutorial
{
class Program
{
static void Main(string[] args)
{
var fileName = @"C:\Users\csharpnaija\Documents\favicon.ico";
int i = 0;
{
i++;
{
Console.WriteLine();
}
}
}
}
}
The example
outputs a small image in hexadecimal notation.
while ((c = fs.ReadByte()) != -1)
{
The ReadByte
()
method reads
a byte from the file and advances the read position one byte. It returns the
byte, cast to an Int32
, or -1
if the end of the stream has been reached. It is OK to
read the image by one byte since we deal with a very small image.
Console.Write("{0:X2} ", c);
The {0:X2}
outputs the
bytes in hexadecimal notation.
if (i % 10 == 0)
{
Console.WriteLine();
}
We write a new
line character after ten columns.
In this post, we
have used FileStream
to read and
write files.
Reference
1. Zetcode
2. Tutlane
Comments
Post a Comment