ZetCode

C# FileStream

最后修改于 2025 年 4 月 22 日

本 C# FileStream 教程演示了如何使用 C# 中的 FileStream 类来读取和写入文件。

C# FileStream

FileStream 类为文件操作提供了一个 Stream 接口,从而能够进行同步和异步的读取和写入。流表示从源到目标的数据序列,源和目标可能包括磁盘、内存、套接字或其他程序。

在使用 FileStream 时,操作在字节级别执行。为了更方便地处理文本数据,开发人员可以使用 StreamWriterStreamReader 类。

C# FileStream 写入文本

以下示例说明了如何使用 FileStream 类将文本数据写入文件。

Program.cs
using System.Text;

var fileName = @"C:\Users\Jano\Documents\words.txt";

using FileStream fs = File.OpenWrite(fileName);

var data = "falcon\nhawk\nforest\ncloud\nsky";
byte[] bytes = Encoding.UTF8.GetBytes(data);

fs.Write(bytes, 0, bytes.Length);

此示例将几个单词写入文本文件,演示了基本的文件输出操作。

using FileStream fs = File.OpenWrite(fileName);

File.OpenWrite 方法初始化一个配置为写入操作的 FileStream 实例。

var data = "falcon\nhawk\nforest\ncloud\nsky";
byte[] bytes = Encoding.UTF8.GetBytes(data);

文本数据使用 Encoding.UTF8.GetBytes 方法转换为字节数组以进行文件写入。

fs.Write(bytes, 0, bytes.Length);

Write 方法将字节数组写入 FileStream,将数据存储在文件中。

C# FileStream 使用 StreamWriter 写入文本

此示例演示了将 FileStreamStreamWriter 结合使用以进行高效文本写入。

Program.cs
var fileName = @"C:\Users\Jano\Documents\words.txt";

using FileStream fs = File.Create(fileName);
using var sr = new StreamWriter(fs);

sr.WriteLine("coin\nfalcon\nhawk\nforest");

Console.WriteLine("done");

此示例使用 StreamWriter 将文本写入文件,从而简化了以指定编码写入字符数据的过程。

using FileStream fs = File.Create(fileName);
using var sr = new StreamWriter(fs);

创建一个 StreamWriter 实例,并将 FileStream 作为其底层流接受。

sr.WriteLine("coin\nfalcon\nhawk\nforest");

WriteLine 方法将一行文本写入 FileStream,并附加一个换行符。

C# FileStream 读取文本

以下示例展示了如何使用 FileStream 从文件中读取文本数据。

Program.cs
using System.Text;

var fileName = @"C:\Users\Jano\Documents\words.txt";

using FileStream fs = File.OpenRead(fileName);

byte[] buf = new byte[1024];
int c;

while ((c = fs.Read(buf, 0, buf.Length)) > 0)
{
    Console.WriteLine(Encoding.UTF8.GetString(buf, 0, c));
}

此示例读取一个文本文件,使用 UTF8 编码将其字节数据转换为字符串,并将内容输出到控制台。

using FileStream fs = File.OpenRead(fileName);

File.OpenRead 方法打开一个用于读取的 FileStream,为输入操作准备文件。

byte[] buf = new byte[1024];

分配一个字节数组 buf,用于存储从文件中读取的数据。

while ((c = fs.Read(buf, 0, buf.Length)) > 0)
{
    Console.WriteLine(Encoding.UTF8.GetString(buf, 0, c));
}

Read 方法将一个字节块从 FileStream 检索到缓冲区中。Encoding.UTF8.GetString 方法将这些字节转换为字符串以进行显示。

C# FileStream 使用 StreamReader 读取文本

此示例演示了结合使用 FileStreamStreamReader 从文件中读取文本。

Program.cs
var fileName = @"C:\Users\Jano\Documents\words.txt";

using FileStream fs = File.OpenRead(fileName);
using var sr = new StreamReader(fs);

string line;

while ((line = sr.ReadLine()) != null)
{
    Console.WriteLine(line);
}

此示例使用 StreamReader 读取一个文本文件,从而无需手动进行字节到字符的转换。

using FileStream fs = File.OpenRead(fileName);
using var sr = new StreamReader(fs);

StreamReader 使用 FileStream 初始化,如果未指定,则默认使用 UTF8 编码。

string line;

while ((line = sr.ReadLine()) != null)
{
    Console.WriteLine(line);
}

StreamReaderReadLine 方法检索每一行文本,并在流结束时返回 null

C# FileStream CopyTo

CopyTo 方法将字节从一个流传输到另一个流,从而简化了文件复制操作。

Program.cs
var fileName = "words.txt";
using var fs = new FileStream(fileName, FileMode.Open);

var fileName2 = "words_copy.txt";
using var fs2 = new FileStream(fileName2, FileMode.OpenOrCreate);

fs.CopyTo(fs2);

Console.WriteLine("File copied");

此示例使用 CopyTo 方法复制一个文本文件,演示了一个简单的文件复制过程。

C# FileStream 下载图片

以下示例说明了如何使用 FileStream 下载一个小图像文件。

Program.cs
using var httpClient = new HttpClient();
var url = "http://webcode.me/favicon.ico";
byte[] imageBytes = await httpClient.GetByteArrayAsync(url);

using var fs = new FileStream("favicon.ico", FileMode.Create);
fs.Write(imageBytes, 0, imageBytes.Length);

Console.WriteLine("Image downloaded");

此示例使用 HttpClient 获取一个小图像作为字节数组,然后使用 FileStream 将其写入文件。

using var fs = new FileStream("favicon.ico", FileMode.Create);
fs.Write(imageBytes, 0, imageBytes.Length);

创建一个新文件进行写入,并使用 Write 方法将图像的字节数组写入其中。

C# FileStream 读取图片

此示例演示了读取图像文件并将内容显示为十六进制数据。

Program.cs
var fileName = @"C:\Users\Jano\Documents\favicon.ico";

using var fs = new FileStream(fileName, FileMode.Open);

int c;
int i = 0;

while ((c = fs.ReadByte()) != -1)
{

    Console.Write("{0:X2} ", c);
    i++;

    if (i % 10 == 0)
    {
        Console.WriteLine();
    }
}

此示例读取一个小图像文件,并以十六进制格式输出其字节,适用于小文件。

while ((c = fs.ReadByte()) != -1)
{

ReadByte 方法从文件中读取一个字节,推进位置,并在流结束时返回 -1。

Console.Write("{0:X2} ", c);

格式说明符 {0:X2} 以两位十六进制表示法显示每个字节。

if (i % 10 == 0)
{
    Console.WriteLine();
}

每隔十个字节插入一个换行符,以便将十六进制输出组织成行。

C# FileStream 流式传输

流式传输涉及连续传输数据,允许接收者在接收到整个文件之前处理它。

Program.cs
using var httpClient = new HttpClient();

var url = "https://cdn.netbsd.org/pub/NetBSD/NetBSD-9.2/images/NetBSD-9.2-amd64-install.img.gz";

var fname = Path.GetFileName(url);

var resp = await httpClient.GetAsync(url,
    HttpCompletionOption.ResponseHeadersRead);
resp.EnsureSuccessStatusCode();

using Stream ms = await resp.Content.ReadAsStreamAsync();

using FileStream fs = File.Create(fname);
await ms.CopyToAsync(fs);

Console.WriteLine("file downloaded");

此示例使用流式传输下载 NetBSD USB 镜像,从而能够有效地处理大型文件。

using var httpClient = new HttpClient();

HttpClient 类有助于进行 HTTP 请求,以下载网络内容。

var resp = await httpClient.GetAsync(url,
    HttpCompletionOption.ResponseHeadersRead);

使用 HttpCompletionOption.ResponseHeadersRead,操作在读取标头后完成,从而推迟内容检索。

using Stream ms = await resp.Content.ReadAsStreamAsync();

ReadAsStreamAsync 方法返回一个流,该流表示作为异步操作的 HTTP 内容。

using FileStream fs = File.Create(fname);

File.Create 方法创建或覆盖一个文件,为流式传输数据做准备。

await ms.CopyToAsync(fs);

CopyToAsync 方法持续将流的数据传输到文件流。

来源

FileStream 类 - 语言参考

本文探讨了使用 FileStream 在 C# 中读取和写入文件。

作者

我是 Jan Bodnar,一位经验丰富的软件开发程序员。自 2007 年以来,我撰写了超过 1,400 篇编程文章和八本电子书。凭借十多年的编程教学经验,我通过全面的教程分享我的专业知识。

列出所有 C# 教程