什么是流?
在计算机科学中,流(stream)是一组有序的连续数据,它们通常作为输入或输出的方式。在C#中,流是一种对某些数据源(如文件)进行操作的基本方式。接下来,我们将介绍C#中常用的一组流。
1. 文件流(File stream)
文件流是一种在文件系统上进行的流,可以访问文件的内容并将其读取到程序中,也可以将程序中的内容写入文件中。
文件流的读取
文件流的读取可以使用StreamReader类或BinaryReader类。
StreamReader类用于从文件中读取文本数据。以下是一个从文件中读取文本内容的示例:
string filePath = "C:\\example.txt";
using (StreamReader sr = new StreamReader(filePath))
{
string line;
while ((line = sr.ReadLine()) != null)
{
Console.WriteLine(line);
}
}
以上代码中的重要部分:
using
语句可以自动关闭StreamReader对象。
sr.ReadLine()
方法可用于从文件中读取一行。
BinaryReader类用于从文件中读取二进制数据。以下是一个从文件中读取二进制文件的示例:
string filePath = "C:\\example";
using (BinaryReader br = new BinaryReader(File.Open(filePath, FileMode.Open)))
{
int length = (int)br.BaseStream.Length;
byte[] buffer = br.ReadBytes(length);
}
以上代码中的重要部分:
File.Open()
方法可用于打开文件。
br.BaseStream.Length
属性可用于获取文件长度。
br.ReadBytes()
方法可用于从文件中读取字节。
文件流的写入
文件流的写入可以使用StreamWriter类或BinaryWriter类。
StreamWriter类用于将文本数据写入到文件中。以下是一个将文本内容写入文件的示例:
string filePath = "C:\\example.txt";
using (StreamWriter sw = new StreamWriter(filePath))
{
sw.WriteLine("Hello, world!");
}
以上代码中的重要部分:
using
语句可以自动关闭StreamWriter对象。
sw.WriteLine()
方法可用于将一行文本数据写入文件中。
BinaryWriter类用于将二进制数据写入到文件中。以下是一个将二进制数据写入文件的示例:
string filePath = "C:\\example";
byte[] buffer = new byte[] { 0x48, 0x65, 0x6C, 0x6C, 0x6F, 0x2C, 0x20, 0x77, 0x6F, 0x72, 0x6C, 0x64, 0x21 };
using (BinaryWriter bw = new BinaryWriter(File.Open(filePath, FileMode.Create)))
{
bw.Write(buffer);
}
以上代码中的重要部分:
FileMode.Create
枚举值可用于创建文件。
bw.Write()
方法可用于将字节数组写入文件中。
2. 内存流(Memory stream)
内存流是一种在内存中进行的流,可以从中读取数据,也可以将数据写入其中。与文件流不同的是,内存流不会在磁盘上创建文件。
内存流的读取
内存流的读取可以使用StreamReader类或BinaryReader类。
以下是一个从内存流中读取文本数据的示例:
byte[] buffer = Encoding.UTF8.GetBytes("Hello, world!");
using (MemoryStream ms = new MemoryStream(buffer))
using (StreamReader sr = new StreamReader(ms))
{
string line = sr.ReadLine();
}
以上代码中的重要部分:
MemoryStream
类用于创建一个内存流。
StreamReader
类用于从内存流中读取文本数据。
以下是一个从内存流中读取二进制数据的示例:
byte[] buffer = new byte[] { 0x48, 0x65, 0x6C, 0x6C, 0x6F, 0x2C, 0x20, 0x77, 0x6F, 0x72, 0x6C, 0x64, 0x21 };
using (MemoryStream ms = new MemoryStream(buffer))
using (BinaryReader br = new BinaryReader(ms))
{
byte[] data = br.ReadBytes(buffer.Length);
}
以上代码中的重要部分:
BinaryReader
类用于从内存流中读取二进制数据。
内存流的写入
内存流的写入可以使用StreamWriter类或BinaryWriter类。
以下是一个将文本数据写入内存流的示例:
using (MemoryStream ms = new MemoryStream())
using (StreamWriter sw = new StreamWriter(ms))
{
sw.WriteLine("Hello, world!");
sw.Flush();
byte[] buffer = ms.ToArray();
}
以上代码中的重要部分:
StreamWriter
类用于将文本数据写入内存流中。
sw.Flush()
方法用于清空缓冲区。
ms.ToArray()
方法可用于将内存流中的内容转换为字节数组。
以下是一个将二进制数据写入内存流的示例:
using (MemoryStream ms = new MemoryStream())
using (BinaryWriter bw = new BinaryWriter(ms))
{
byte[] buffer = new byte[] { 0x48, 0x65, 0x6C, 0x6C, 0x6F, 0x2C, 0x20, 0x77, 0x6F, 0x72, 0x6C, 0x64, 0x21 };
bw.Write(buffer);
bw.Flush();
byte[] data = ms.ToArray();
}
以上代码中的重要部分:
BinaryWriter
类用于将二进制数据写入内存流中。
bw.Flush()
方法用于清空缓冲区。
ms.ToArray()
方法可用于将内存流中的内容转换为字节数组。
3. 网络流(Network stream)
网络流是一种通过网络连接进行操作的流,可以在网络上发送和接收数据。
网络流的读取
网络流的读取可以使用StreamReader类或BinaryReader类。
以下是一个从网络流中读取文本数据的示例:
using (TcpClient client = new TcpClient("localhost", 12345))
using (StreamReader sr = new StreamReader(client.GetStream()))
{
string line = sr.ReadLine();
}
以上代码中的重要部分:
TcpClient
类用于创建一个TCP连接。
client.GetStream()
方法可用于获取网络流。
StreamReader
类用于从网络流中读取文本数据。
以下是一个从网络流中读取二进制数据的示例:
using (TcpClient client = new TcpClient("localhost", 12345))
using (BinaryReader br = new BinaryReader(client.GetStream()))
{
int length = (int)br.BaseStream.Length;
byte[] buffer = br.ReadBytes(length);
}
以上代码中的重要部分:
BinaryReader
类用于从网络流中读取二进制数据。
网络流的写入
网络流的写入可以使用StreamWriter类或BinaryWriter类。
以下是一个将文本数据写入网络流的示例:
using (TcpClient client = new TcpClient("localhost", 12345))
using (StreamWriter sw = new StreamWriter(client.GetStream()))
{
sw.WriteLine("Hello, world!");
}
以上代码中的重要部分:
StreamWriter
类用于将文本数据写入网络流中。
以下是一个将二进制数据写入网络流的示例:
using (TcpClient client = new TcpClient("localhost", 12345))
using (BinaryWriter bw = new BinaryWriter(client.GetStream()))
{
byte[] buffer = new byte[] { 0x48, 0x65, 0x6C, 0x6C, 0x6F, 0x2C, 0x20, 0x77, 0x6F, 0x72, 0x6C, 0x64, 0x21 };
bw.Write(buffer);
}
以上代码中的重要部分:
BinaryWriter
类用于将二进制数据写入网络流中。
总结
C#中常用的一组流包括文件流、内存流和网络流。文件流用于访问文件系统上的文件,内存流用于将数据存储在内存中进行操作,网络流用于通过网络进行数据的传输。在不同的流类型中,读取和写入数据的操作也有所不同,需要使用不同的类和方法来进行操作。