A stream is an abstraction of a sequence of bytes.
Can be accessed in sequential order (pipe with water flowing through it)
Text files, Images, Network access
Two main streams
Input stream (read data)
Output stream (write date)
System.IO namespace in C#
Program
Input stream
Output stream
Input Source (keyboard, file, network, etc.)
Output Sink (console, file, network, etc.)
Stream fileStream = new FileStream("../../../test.jpg", FileMode.Open, FileAccess.Read);
// Do some operations with the file stream
// Close the stream
fileStream.Close();
// The stream is automatically closed
using (fileStream = new FileStream("../../../test.jpg", FileMode.Open, FileAccess.Read))
{
// Do some operations with the file stream
}
// Write new string to file
string str = "Telerik Academy Alpha";
using(FileStream fileStream = new FileStream("../../../test.txt", FileMode.Open))
{
for (int i = 0; i < str.Length; i++)
{
fileStream.WriteByte((byte)str[i]);
}
}
// Read all chars
using (FileStream fileStream = new FileStream("../../../test.txt", FileMode.Open))
{
for (int i = 0; i < fileStream.Length; i++)
{
Console.Write((char)fileStream.ReadByte());
}
}
StreamReader/Writer vs FileStream
streams handle bytes
readers/writers handle characters
var reader = new StreamReader("../../../test.txt");
Console.WriteLine((char)reader.Read()); // output: T
// Should close it before using it again below
// Otherwidse the file will be in use
reader.Close();
FileStream fileStream = new FileStream("../../../test.txt", FileMode.Open);
Console.WriteLine((char)fileStream.ReadByte()); // output: T
fileStream.Close();
StreamReader/Writer
Reader (byte[] to string)
Writer (string to byte[])
using (var reader = new StreamReader("../../../test.txt"))
{
Console.WriteLine(reader.ReadLine()); // Telerik Academy
// More methods: reader.ReadToEnd();
}
using (var writer = new StreamWriter("../../../test.txt"))
{
writer.WriteLine("Telerik Academy Alpha"); // Writes to text file
// More methods: writer.Write();
}
Combine Stream and StreamReader/Writer
StreamReader/Writer accepts stream or path
using (FileStream fileStream = new FileStream("../../../test.txt", FileMode.Open))
{
var reader = new StreamReader(fileStream);
Console.WriteLine(reader.ReadLine()); // Telerik Academy
}
You could read or write text files with wrappers over a stream
Both StreamReader/Writer and File classes are wrappers over streams
Both could read all lines of text from a file
StreamReader/Writer gives more control
It could read/write file without loading the whole file
File makes your code shorter and more understandable
using (StreamReader reader = new StreamReader("../../../test.txt"))
{
Console.WriteLine(reader.ReadToEnd());
}
Console.WriteLine(File.ReadAllText("../../../test.txt"));
Below code is reading all the text from a file with the two options
StreamReader
File
StreamReader/Writer could read/write to/from files line by line
This is very useful for certain situations
You should choose which class to use (File or StreamReader/Writer) depending on your code requirements
There is no right or wrong
// Copy an image
// This reads the file as a byte array
// You could use any other method or class
byte[] arr = File.ReadAllBytes("../../../test.jpg");
// This writes the file to the file system
File.WriteAllBytes("../../../test-copy.jpg", arr);
You can copy any file
Image
Text file
etc.
// This will read the file as byte[]
// then it will save another file with bytes only at the even positions
// if the file is an image/pdf or another type of file it will be corrupted
// but if it is a text file it will have missing parts
byte[] arr = File.ReadAllBytes("../../../test.pdf");
List<byte> list = new List<byte>();
for (int i = 0; i < arr.Length; i++)
{
if (i % 2 == 0)
{
list.Add(arr[i]);
}
}
File.WriteAllBytes("../../../test-part.pdf", list.ToArray());