跳转到内容

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

流层次结构[编辑 | 编辑源代码]

classDiagram Stream <|-- FileStream Stream <|-- MemoryStream Stream <|-- NetworkStream Stream : +Read() Stream : +Write() Stream : +Seek() FileStream : +Lock() FileStream : +Unlock()

数学原理[编辑 | 编辑源代码]

文件流的缓冲区大小选择可以使用以下公式优化:

BufferSize=TotalFileSizeNumberOfAccesses

其中:

  • TotalFileSize为文件总大小
  • NumberOfAccesses为预计访问次数

最佳实践[编辑 | 编辑源代码]

  • 始终使用using语句确保流被正确释放
  • 对于文本文件,考虑使用StreamReader/StreamWriter包装器
  • 大文件操作时设置适当的缓冲区大小(通常4KB-64KB)
  • 异步操作时注意异常处理

常见问题[编辑 | 编辑源代码]

Q: 何时应该使用FileStream而不是File类的简便方法? A: 当需要:

  • 处理二进制文件
  • 随机访问文件内容
  • 处理大于1GB的文件
  • 需要精细控制读写过程时

Q: 文件流与内存流的区别? A: 文件流操作磁盘文件,而内存流(MemoryStream)操作内存中的字节数组,后者速度更快但不持久化。