流操作 #
一、Stream基类 #
1.1 Stream属性 #
csharp
public abstract class Stream
{
public abstract bool CanRead { get; }
public abstract bool CanWrite { get; }
public abstract bool CanSeek { get; }
public abstract long Length { get; }
public abstract long Position { get; set; }
}
1.2 Stream方法 #
csharp
public abstract class Stream
{
public abstract int Read(byte[] buffer, int offset, int count);
public abstract void Write(byte[] buffer, int offset, int count);
public abstract long Seek(long offset, SeekOrigin origin);
public abstract void Flush();
public abstract void SetLength(long value);
public void CopyTo(Stream destination);
public Task CopyToAsync(Stream destination);
}
二、FileStream #
2.1 创建FileStream #
csharp
using var fs = new FileStream("data.bin", FileMode.Open);
using var fs = new FileStream("data.bin", FileMode.OpenOrCreate, FileAccess.ReadWrite);
using var fs = new FileStream("data.bin", FileMode.Create, FileAccess.Write, FileShare.None);
using var fs = File.OpenRead("data.bin");
using var fs = File.OpenWrite("data.bin");
using var fs = File.Create("data.bin");
2.2 FileMode枚举 #
| 值 | 说明 |
|---|---|
| CreateNew | 创建新文件,存在则异常 |
| Create | 创建新文件,存在则覆盖 |
| Open | 打开文件,不存在则异常 |
| OpenOrCreate | 打开或创建 |
| Truncate | 打开并清空 |
| Append | 追加模式 |
2.3 读写操作 #
csharp
using var fs = new FileStream("data.bin", FileMode.Create);
byte[] data = Encoding.UTF8.GetBytes("Hello World");
fs.Write(data, 0, data.Length);
using var fs = new FileStream("data.bin", FileMode.Open);
byte[] buffer = new byte[1024];
int bytesRead = fs.Read(buffer, 0, buffer.Length);
string content = Encoding.UTF8.GetString(buffer, 0, bytesRead);
2.4 定位操作 #
csharp
using var fs = new FileStream("data.bin", FileMode.Open);
fs.Seek(0, SeekOrigin.Begin);
fs.Seek(-10, SeekOrigin.End);
fs.Seek(100, SeekOrigin.Current);
long position = fs.Position;
long length = fs.Length;
三、StreamReader #
3.1 创建StreamReader #
csharp
using var reader = new StreamReader("data.txt");
using var reader = new StreamReader("data.txt", Encoding.UTF8);
using var reader = new StreamReader(File.OpenRead("data.txt"));
using var reader = new StreamReader(stream, Encoding.UTF8, detectEncodingFromByteOrderMarks: true);
3.2 读取方法 #
csharp
using var reader = new StreamReader("data.txt");
string content = reader.ReadToEnd();
string line;
while ((line = reader.ReadLine()) != null)
{
Console.WriteLine(line);
}
int charCode = reader.Read();
char[] buffer = new char[1024];
int charsRead = reader.Read(buffer, 0, buffer.Length);
3.3 异步读取 #
csharp
public async Task<string> ReadFileAsync(string path)
{
using var reader = new StreamReader(path);
return await reader.ReadToEndAsync();
}
public async Task ProcessLinesAsync(string path)
{
using var reader = new StreamReader(path);
string line;
while ((line = await reader.ReadLineAsync()) != null)
{
await ProcessLineAsync(line);
}
}
四、StreamWriter #
4.1 创建StreamWriter #
csharp
using var writer = new StreamWriter("output.txt");
using var writer = new StreamWriter("output.txt", append: true);
using var writer = new StreamWriter("output.txt", false, Encoding.UTF8);
using var writer = new StreamWriter(stream, Encoding.UTF8);
4.2 写入方法 #
csharp
using var writer = new StreamWriter("output.txt");
writer.Write("Hello");
writer.Write(" ");
writer.WriteLine("World");
writer.WriteLine("新的一行");
writer.Flush();
4.3 异步写入 #
csharp
public async Task WriteFileAsync(string path, string content)
{
await using var writer = new StreamWriter(path);
await writer.WriteAsync(content);
}
public async Task WriteLinesAsync(string path, IEnumerable<string> lines)
{
await using var writer = new StreamWriter(path);
foreach (var line in lines)
{
await writer.WriteLineAsync(line);
}
}
五、MemoryStream #
5.1 基本用法 #
csharp
using var ms = new MemoryStream();
byte[] data = Encoding.UTF8.GetBytes("Hello");
ms.Write(data, 0, data.Length);
ms.Position = 0;
byte[] result = ms.ToArray();
using var ms = new MemoryStream(data);
using var reader = new StreamReader(ms);
string content = reader.ReadToEnd();
5.2 内存流操作 #
csharp
using var ms = new MemoryStream();
for (int i = 0; i < 10; i++)
{
byte[] data = BitConverter.GetBytes(i);
ms.Write(data, 0, data.Length);
}
byte[] allData = ms.ToArray();
ms.Position = 0;
for (int i = 0; i < 10; i++)
{
byte[] buffer = new byte[4];
ms.Read(buffer, 0, 4);
int value = BitConverter.ToInt32(buffer, 0);
}
六、BufferedStream #
6.1 缓冲流 #
csharp
using var fs = new FileStream("large.bin", FileMode.Open);
using var bs = new BufferedStream(fs, bufferSize: 8192);
byte[] buffer = new byte[1024];
int bytesRead;
while ((bytesRead = bs.Read(buffer, 0, buffer.Length)) > 0)
{
Process(buffer, bytesRead);
}
七、流复制 #
7.1 CopyTo方法 #
csharp
using var source = File.OpenRead("source.txt");
using var dest = File.OpenWrite("dest.txt");
source.CopyTo(dest);
await source.CopyToAsync(dest);
7.2 自定义复制 #
csharp
public static void CopyStream(Stream source, Stream dest)
{
byte[] buffer = new byte[8192];
int bytesRead;
while ((bytesRead = source.Read(buffer, 0, buffer.Length)) > 0)
{
dest.Write(buffer, 0, bytesRead);
}
}
public static async Task CopyStreamAsync(Stream source, Stream dest)
{
byte[] buffer = new byte[8192];
int bytesRead;
while ((bytesRead = await source.ReadAsync(buffer, 0, buffer.Length)) > 0)
{
await dest.WriteAsync(buffer, 0, bytesRead);
}
}
八、实战示例 #
8.1 文件复制 #
csharp
public static void CopyFile(string sourcePath, string destPath)
{
using var source = File.OpenRead(sourcePath);
using var dest = File.Create(destPath);
source.CopyTo(dest);
}
8.2 流转字符串 #
csharp
public static string StreamToString(Stream stream)
{
using var reader = new StreamReader(stream);
return reader.ReadToEnd();
}
public static Stream StringToStream(string content)
{
var stream = new MemoryStream();
using var writer = new StreamWriter(stream, leaveOpen: true);
writer.Write(content);
writer.Flush();
stream.Position = 0;
return stream;
}
九、总结 #
流操作要点:
| 类 | 用途 |
|---|---|
| FileStream | 文件流 |
| MemoryStream | 内存流 |
| StreamReader | 文本读取 |
| StreamWriter | 文本写入 |
| BufferedStream | 缓冲流 |
下一步,让我们学习序列化!
最后更新:2026-03-26