Streams of data.

# What is a data Stream?

• Like a flow of water, a data stream is a flow of data.
• Streams can come from any origin: Lake, Fountain or Mountain.
• Data Streams can come from anywhere too: File, network or web server.
• What matters is that we have the data we can deal with.
• This is an abstraction, removing detail of the origin.

# What is the data?

• All data is an array of bytes
• When streaming from YouTube or Netflix, the server is sending bytes to your computer.
• The bytes are then converted to something we can use such as a string of text or a video.

# Activity - Streams on YouTube

Let's watch a music video on YouTube and watch the streams come in.

## File stream

FileStream

• Read or Write data from a file
• Constructor takes 3 parameters:
1. The path of the file to open.
2. The FileMode, how the file should be opened.
3. The FileAccess, what we are allowed to do with this stream.
FileStream fileStream = new FileStream(
"MyFile.txt",
FileMode.Create,
FileAccess.Write);


## Memory stream

MemoryStream

• A stream that exists in memory.
• It does not need an origins, it just exists.
• Software Architecture may require streams to be passed between objects.
• E.g. A Reader Service and a Generator.

## Stream helpers

• Streams are not always asy for developers to use.

• There are some helper objects that make life easier. 😌
• StreamWriter - Helps develops more easily write to streams.

# Stream positions

• When we first create the stream, position is 0.
• As we read/write the position moves on.
• Developers can also write code change the position of the stream.
• This is important when resetting the stream back to 0.

# Open and close

• Streams need to be opened and closed when we use them.
Stream stream;
stream.Open();
// Do some work.
stream.Close();

• It is easier for us to use the using statement.
• This will automatically close a stream for us.
using (Stream stream)
{
// Do some work.
}


# Serialision

• Representing an object as text so that it can be stored.
• Stored serialised objects is a database or on the file system.
• Save objects as special formats such as XML and JSON.

# Serialision attribute

In C#, classes need to be decorated with the Serializable attribute.

• This tells to compiler that this class can be serialised.

# Formatter

• Objects need to be formatted in a certain way. One formatter is the BinaryFormatter.
• This formats the object as binary.

# JSON

• JSON is a popular format for storing data.
• We can use a library called JSON.NET
string json = JsonConvert.SerializeObject(new {
Name = "Apple,
Expiry = new DateTime(2008, 12, 28),
Sizes = new string[] { "Small" }
});
// {
//   "Name": "Apple",
//   "Expiry": "2008-12-28T00:00:00",
//   "Sizes": [
//     "Small"
//   ]
// }


# Activity - Stream Unit Tests

We're going to create some Unit Tests to test reading and writing streams.

[Let's get started](Activity2/Stream Unit Tests.html)

# That's all folks!

What have we learnt?

• Streams are arrays of byte data.
• We can read and write to files using streams.
• As streams are read there position changes.
• There a different types of stream.
• Serialisation is the process of retrospecting data as text.
• Objects can be serialised using special formatters.
• Objects can also be serialised as JSON or another format.