跳到主要内容

C# 文件流

介绍

在 C# 中,文件流(FileStream)是处理文件输入输出(I/O)操作的核心类之一。文件流允许你以字节为单位读取或写入文件,适用于处理大文件或需要精细控制文件操作的场景。与简单的文件读写方法(如 File.ReadAllTextFile.WriteAllText)不同,文件流提供了更底层的控制,允许你逐字节或逐块处理文件。

文件流的基本概念

文件流是 System.IO 命名空间中的一个类,用于表示文件的字节流。通过文件流,你可以执行以下操作:

  • 读取文件的字节数据。
  • 写入字节数据到文件。
  • 定位文件中的特定位置。
  • 控制文件的访问模式(如只读、只写或读写)。

文件流的核心思想是将文件视为一个字节序列,你可以在这个序列中移动并操作数据。

创建文件流

要使用文件流,首先需要创建一个 FileStream 对象。以下是创建文件流的基本语法:

csharp
using System.IO;

FileStream fs = new FileStream("example.txt", FileMode.OpenOrCreate, FileAccess.ReadWrite);

参数解释

  • 文件路径:指定要操作的文件路径。
  • FileMode:指定文件的打开模式。常见的模式包括:
    • FileMode.Open:打开现有文件。
    • FileMode.Create:创建新文件,如果文件已存在则覆盖。
    • FileMode.OpenOrCreate:如果文件存在则打开,否则创建新文件。
  • FileAccess:指定文件的访问权限。常见的权限包括:
    • FileAccess.Read:只读访问。
    • FileAccess.Write:只写访问。
    • FileAccess.ReadWrite:读写访问。

读取文件数据

使用文件流读取文件数据时,通常需要定义一个字节数组来存储读取的数据。以下是一个读取文件内容的示例:

csharp
using System;
using System.IO;
using System.Text;

class Program
{
static void Main()
{
using (FileStream fs = new FileStream("example.txt", FileMode.Open, FileAccess.Read))
{
byte[] buffer = new byte[1024];
int bytesRead = fs.Read(buffer, 0, buffer.Length);
string content = Encoding.UTF8.GetString(buffer, 0, bytesRead);
Console.WriteLine(content);
}
}
}

代码解释

  1. 使用 FileStream 打开文件。
  2. 定义一个字节数组 buffer 来存储读取的数据。
  3. 使用 Read 方法从文件流中读取数据到 buffer 中。
  4. 将字节数组转换为字符串并输出。

写入文件数据

写入文件数据与读取类似,只是方向相反。以下是一个写入文件内容的示例:

csharp
using System;
using System.IO;
using System.Text;

class Program
{
static void Main()
{
using (FileStream fs = new FileStream("example.txt", FileMode.OpenOrCreate, FileAccess.Write))
{
string content = "Hello, FileStream!";
byte[] buffer = Encoding.UTF8.GetBytes(content);
fs.Write(buffer, 0, buffer.Length);
}
}
}

代码解释

  1. 使用 FileStream 打开文件。
  2. 将字符串内容转换为字节数组。
  3. 使用 Write 方法将字节数组写入文件。

文件定位

文件流允许你在文件中定位到特定位置。通过 Seek 方法,你可以移动文件指针到指定的位置。以下是一个示例:

csharp
using System;
using System.IO;

class Program
{
static void Main()
{
using (FileStream fs = new FileStream("example.txt", FileMode.Open, FileAccess.ReadWrite))
{
fs.Seek(5, SeekOrigin.Begin); // 将文件指针移动到第 5 个字节
byte[] buffer = new byte[10];
int bytesRead = fs.Read(buffer, 0, buffer.Length);
string content = Encoding.UTF8.GetString(buffer, 0, bytesRead);
Console.WriteLine(content);
}
}
}

代码解释

  1. 使用 Seek 方法将文件指针移动到第 5 个字节。
  2. 从该位置开始读取数据。

实际应用场景

1. 大文件处理

文件流非常适合处理大文件,因为它允许你逐块读取或写入数据,而不需要一次性将整个文件加载到内存中。例如,处理日志文件或视频文件时,文件流是理想的选择。

2. 二进制文件操作

文件流可以用于读取或写入二进制文件,如图片、音频或视频文件。以下是一个读取图片文件的示例:

csharp
using System;
using System.IO;

class Program
{
static void Main()
{
using (FileStream fs = new FileStream("image.jpg", FileMode.Open, FileAccess.Read))
{
byte[] buffer = new byte[fs.Length];
fs.Read(buffer, 0, buffer.Length);
// 处理二进制数据
}
}
}

总结

文件流是 C# 中处理文件 I/O 操作的重要工具。通过文件流,你可以以字节为单位读取或写入文件,并灵活控制文件的操作。本文介绍了文件流的基本概念、创建方法、读写操作以及实际应用场景。希望这些内容能帮助你更好地理解和使用文件流。

附加资源与练习

提示

如果你对文件流的使用有任何疑问,欢迎在评论区留言,我们会尽快为你解答!