C Sharp 文件流
外观
C#文件流[编辑 | 编辑源代码]
文件流(File Stream)是C#中用于读写文件数据的基础机制,它提供了对文件内容的字节级访问。通过文件流,开发者可以高效地处理大型文件或需要精确控制读写位置的场景。
概述[编辑 | 编辑源代码]
在C#中,System.IO.FileStream
类是处理文件流的核心类,它继承自System.IO.Stream
抽象类。文件流的主要特点包括:
- 字节级操作:直接处理原始字节数据
- 随机访问:通过
Seek()
方法定位读写位置 - 缓冲机制:提高IO性能
- 同步/异步支持:支持
ReadAsync
/WriteAsync
方法
基础用法[编辑 | 编辑源代码]
创建文件流[编辑 | 编辑源代码]
使用FileStream
构造函数或File.Open
方法创建流:
// 方式1:使用构造函数
FileStream fs = new FileStream("example.txt", FileMode.OpenOrCreate, FileAccess.ReadWrite);
// 方式2:使用File.Open
using (FileStream fs = File.Open("example.txt", FileMode.Append))
{
// 操作文件流
}
参数说明:
- FileMode:指定文件打开方式(CreateNew, Create, Open, OpenOrCreate等)
- FileAccess:指定访问权限(Read, Write, ReadWrite)
- FileShare:控制其他流的共享权限
读写操作[编辑 | 编辑源代码]
基本读写方法:
byte[] data = new byte[1024];
// 读取数据
int bytesRead = fs.Read(data, 0, data.Length);
// 写入数据
byte[] dataToWrite = Encoding.UTF8.GetBytes("Hello, FileStream!");
fs.Write(dataToWrite, 0, dataToWrite.Length);
高级特性[编辑 | 编辑源代码]
异步操作[编辑 | 编辑源代码]
.NET提供了异步API以提高IO密集型应用的性能:
async Task ReadFileAsync(string path)
{
using (FileStream fs = new FileStream(path, FileMode.Open))
{
byte[] buffer = new byte[1024];
int bytesRead = await fs.ReadAsync(buffer, 0, buffer.Length);
string content = Encoding.UTF8.GetString(buffer, 0, bytesRead);
Console.WriteLine(content);
}
}
内存映射文件[编辑 | 编辑源代码]
对于超大文件,可以使用内存映射提高性能:
using (var mmf = MemoryMappedFile.CreateFromFile("largefile.bin"))
{
using (var accessor = mmf.CreateViewAccessor())
{
// 直接访问文件内存区域
}
}
实际案例[编辑 | 编辑源代码]
文件加密工具[编辑 | 编辑源代码]
以下示例展示如何使用文件流实现简单的文件加密:
void EncryptFile(string inputPath, string outputPath, byte key)
{
using (FileStream input = File.OpenRead(inputPath))
using (FileStream output = File.Create(outputPath))
{
int byteRead;
while ((byteRead = input.ReadByte()) != -1)
{
output.WriteByte((byte)(byteRead ^ key)); // 简单XOR加密
}
}
}
性能对比[编辑 | 编辑源代码]
文件流与普通文件读写方法的性能差异:
方法 | 10MB文件耗时(ms) |
---|---|
File.ReadAllText | 120 |
FileStream (带缓冲) | 45 |
异步FileStream | 38 |
流层次结构[编辑 | 编辑源代码]
数学原理[编辑 | 编辑源代码]
文件流的缓冲区大小选择可以使用以下公式优化:
其中:
- 为文件总大小
- 为预计访问次数
最佳实践[编辑 | 编辑源代码]
- 始终使用
using
语句确保流被正确释放 - 对于文本文件,考虑使用
StreamReader
/StreamWriter
包装器 - 大文件操作时设置适当的缓冲区大小(通常4KB-64KB)
- 异步操作时注意异常处理
常见问题[编辑 | 编辑源代码]
Q: 何时应该使用FileStream而不是File类的简便方法? A: 当需要:
- 处理二进制文件
- 随机访问文件内容
- 处理大于1GB的文件
- 需要精细控制读写过程时
Q: 文件流与内存流的区别?
A: 文件流操作磁盘文件,而内存流(MemoryStream
)操作内存中的字节数组,后者速度更快但不持久化。