filestream类怎么用?filestream类读取文件乱码怎么办

FileStream 是 .NET 框架中用于对文件进行字节级别读写的核心类,它位于 System.IO 命名空间下。

与 StreamReader/StreamWriter(处理文本)不同,FileStream 处理的是原始字节(byte[]),因此它可以用于读写任何类型的文件,包括文本文件、图片、音频、视频、序列化对象等。

92. 二进制文件的读写(FileStream类)
加载中
92. 二进制文件的读写(FileStream类)

基本用法

创建 FileStream 对象

构造函数通常接收文件路径、访问模式(读/写/追加)、共享模式等参数。

using System;
using System.IO;
class Program
{
    static void Main()
    {
        string filePath = "example.txt";
        // 1. 写入文件(如果文件存在则覆盖,不存在则创建)
        using (FileStream fs = new FileStream(filePath, FileMode.Create, FileAccess.Write))
        {
            byte[] data = System.Text.Encoding.UTF8.GetBytes("Hello, FileStream!");
            fs.Write(data, 0, data.Length);
        }
        // 2. 读取文件
        using (FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read))
        {
            byte[] buffer = new byte[fs.Length];
            fs.Read(buffer, 0, buffer.Length);
            string content = System.Text.Encoding.UTF8.GetString(buffer);
            Console.WriteLine(content); // 输出: Hello, FileStream!
        }
    }
}

注意:using 语句确保 FileStream 在使用后自动调用 Dispose(),从而释放文件句柄和内存资源。


关键枚举参数

FileMode(文件模式)

filestream类怎么用?filestream类读取文件乱码怎么办

值 说明
CreateNew 创建新文件,如果文件已存在则抛出异常
Create 创建新文件,如果文件已存在则覆盖
Open 打开现有文件,如果文件不存在则抛出异常
OpenOrCreate 如果存在则打开,否则创建
Truncate 打开现有文件并清空内容(长度变为0),必须配合 FileAccess.Write
Append 打开文件并将指针移到末尾,用于追加内容,必须配合 FileAccess.Write

FileAccess(访问权限)

值 说明
Read 只读
Write 只写
ReadWrite 可读可写

FileShare(共享模式)

值 说明
None 独占访问,其他进程无法打开该文件
Read 允许其他进程读取
Write 允许其他进程写入
ReadWrite 允许其他进程读写

常用方法

方法 说明
Write(byte[] buffer, int offset, int count) 将字节数组写入流
Read(byte[] buffer, int offset, int count) 从流中读取字节到数组,返回实际读取的字节数
Seek(long offset, SeekOrigin origin) 移动当前文件指针位置
Flush() 清除缓冲区,将所有数据写入底层设备
Close() / Dispose() 关闭流并释放资源

filestream类怎么用?filestream类读取文件乱码怎么办

Seek 示例:随机访问文件

using (FileStream fs = new FileStream("data.bin", FileMode.Open, FileAccess.ReadWrite))
{
    // 移动到文件第100个字节处
    fs.Seek(100, SeekOrigin.Begin);
    byte[] data = new byte[10];
    fs.Read(data, 0, 10); // 从第100字节开始读取10个字节
}

异步操作(推荐用于高性能场景)

在 I/O 密集型应用中(如 Web 服务器、大文件传输),建议使用异步方法以避免阻塞线程。

static async Task CopyFileAsync(string sourcePath, string destPath)
{
    using (FileStream sourceStream = new FileStream(sourcePath, FileMode.Open, FileAccess.Read, FileShare.Read, bufferSize: 4096, useAsync: true))
    using (FileStream destStream = new FileStream(destPath, FileMode.Create, FileAccess.Write, FileShare.None, bufferSize: 4096, useAsync: true))
    {
        byte[] buffer = new byte[4096];
        int bytesRead;
        while ((bytesRead = await sourceStream.ReadAsync(buffer, 0, buffer.Length)) > 0)
        {
            await destStream.WriteAsync(buffer, 0, bytesRead);
        }
    }
}

提示:从 .NET Core 2.0 / .NET Standard 2.1 开始,FileStream 构造函数支持 useAsync: true 参数,启用后内部使用异步 I/O 完成端口,性能更优。


与 StreamReader/StreamWriter 的区别

filestream类怎么用?filestream类读取文件乱码怎么办

特性 FileStream StreamReader/StreamWriter
数据类型 字节(byte) 字符(char)/ 字符串
编码处理 需手动指定编码(如 UTF8) 自动处理编码
适用场景 二进制文件(图片、音频、视频)、自定义格式 纯文本文件
性能 更底层,控制更精细 更高层,使用更方便

最佳实践

  1. 始终使用 using 语句:确保文件句柄被正确释放,避免文件被锁定。
  2. 设置合适的缓冲区大小:默认缓冲区为 4KB,对于大文件操作,可适当增大(如 64KB 或 1MB)以提升性能。
  3. 异步优先:在高并发或大文件场景中,使用 ReadAsync/WriteAsync。
  4. 处理异常:文件操作可能因权限、路径不存在等原因失败,应捕获 IOException、UnauthorizedAccessException 等异常。
  5. 避免在循环中频繁创建 FileStream:如果需要对同一文件多次读写,复用同一个 FileStream 实例(注意线程安全)。

完整示例:安全地复制文件

using System;
using System.IO;
using System.Threading.Tasks;
public class FileHelper
{
    public static async Task CopyFileAsync(string source, string destination)
    {
        if (!File.Exists(source))
            throw new FileNotFoundException("源文件不存在", source);
        try
        {
            using (var sourceStream = new FileStream(source, FileMode.Open, FileAccess.Read, FileShare.Read, 4096, true))
            using (var destStream = new FileStream(destination, FileMode.Create, FileAccess.Write, FileShare.None, 4096, true))
            {
                await sourceStream.CopyToAsync(destStream);
            }
        }
        catch (IOException ex)
        {
            Console.WriteLine($"IO 错误: {ex.Message}");
            throw;
        }
        catch (UnauthorizedAccessException ex)
        {
            Console.WriteLine($"权限不足: {ex.Message}");
            throw;
        }
    }
}

FileStream 是 .NET 中文件操作的基石,掌握它能让你灵活处理各种文件 I/O 场景。

首发原创文章,作者:王坚‌,如若转载,请注明出处:https://test.idctop.com/article/485367.html

赞 (0)
RAKsmart美国站群服务器真的只要$189吗?美国站群服务器租用价格
上一篇 2026年7月12日 06:15
域名估价工具哪个好用?域名价值评估方法
下一篇 2026年7月12日 06:18

相关推荐

  • AI大模型编程软件好用吗?2026最新AI编程工具推荐

    AI大模型编程软件并非简单的代码补全工具,而是通过语义理解与逻辑推理,实现从自然语言到可执行代码的自动化生成,显著降低开发门槛并提升交付效率的智能化辅助系统,AI编程工具的核心价值与底层逻辑过去,程序员需要逐行敲击代码,不仅要处理语法细节,还要反复调试Bug,AI大模型编程软件改变了这一工作流,它不再仅仅是一个……

    2026年6月13日
    4800
  • 番禺低价网站建设靠谱吗,广州网站制作多少钱

    在番禺寻找低价网站建设服务时,核心结论是:避开模板化陷阱,选择基于WordPress或轻量级框架的定制化开发,既能将成本控制在千元至三千元区间,又能确保网站具备SEO友好性和后续扩展性,对于许多初创企业或个体户而言,预算有限是常态,但网站作为线上业务的门面,其质量直接关乎转化效率,传统的“低价”往往意味着粗糙的……

    2026年7月4日
    2800
  • 服务器带宽哪里买更划算?服务器带宽怎么选择

    购买服务器带宽最稳妥的方式是通过阿里云、腾讯云等国内头部云服务商或正规IDC机房直接采购,切勿为了省小钱选择无资质的黑产线路,否则极易遭遇断网、数据丢失或被监管部门关停的风险,在2026年的数字化环境中,服务器带宽不再仅仅是“快”与“慢”的区别,而是业务稳定性的生命线,很多新手站长或企业IT负责人在初期往往陷入……

    2026年7月7日
    3700
  • IIS配置网站如何修改已绑定的网站域名?,具体步骤有哪些?

    在IIS管理器中修改网站绑定的域名,核心操作是进入网站“绑定”设置,编辑或删除旧域名并添加新域名,然后重启站点使配置生效,IIS配置网站域名绑定详细步骤修改IIS绑定的域名听起来复杂,实际操作路径非常清晰,无论你用的是Windows Server 2012还是2022,IIS版本从8.0到10.0,界面和逻辑基……

    2026年7月31日
    300
  • 服务端和数据库在开发中是什么关系,如何区分它们?

    服务端和数据库是任何现代应用都离不开的两大核心组件,服务端负责处理业务逻辑,数据库负责持久化数据,两者协同才能支撑起完整的服务,理解它们的关系和配置方式,是构建稳定高效系统的基础,服务端和数据库是分开部署还是共存单体架构下的服务端与数据库在项目初期,服务端和数据库常常部署在同一台服务器上,这种架构简单,部署成本……

    2026年7月22日
    500
  • 服务器数据库文件如何配置?,配置方法是什么?

    服务器数据库文件配置不是简单的路径填写,而是涉及存储规划、性能调优和数据安全的关键工程, 一个合理的配置能让数据库在面对高并发时保持稳定,在故障时快速恢复;反之,错误的配置可能导致性能瓶颈、数据丢失甚至安全漏洞,为什么数据库文件配置是性能与安全的基石数据库文件配置直接影响操作系统的IO效率、磁盘空间的利用率以及……

    2026年7月21日
    900
  • 服务器客户端网速慢怎么办?如何提升网络传输效率

    服务器与客户端网速并非简单的单向传输,而是受网络延迟、带宽瓶颈及协议握手共同影响的动态博弈过程,提升体验的核心在于优化中间链路而非单纯增加带宽,很多时候,用户觉得网页加载慢或游戏卡顿,第一反应是责怪服务器太烂或者自家宽带不够快,这就像两个人打电话,声音大小(带宽)固然重要,但信号传输的快慢(延迟)和线路是否通畅……

    2026年7月3日
    900
  • 服务器授权码的正确获取方法是什么?,如何查询授权码状态?

    服务器授权码是服务器软件合法使用的核心凭证,获取和管理授权码直接影响企业IT合规与成本控制,服务器授权码和激活码的区别:别再混淆两个概念很多IT管理员在日常工作中会将服务器授权码与普通激活码混为一谈,但两者在授权模式和合规性要求上差异显著,服务器授权码通常用于企业级软件,如Windows Server、SQL……

    2026年7月20日
    1300
  • 华为rds c_通过Python、C或Golang连接RDS for MySQL实例

    华为云RDS for MySQL实例支持Python、C、Golang等多种语言连接,关键在于正确配置SSL证书、白名单和驱动参数,三者均能实现稳定高效的数据交互,Python连接华为云RDS for MySQL实例的完整步骤Python是应用最广泛的数据库连接语言之一,在云数据库场景下,使用pymysql或m……

    2026年8月21日
    100
  • 服务器cpu性能天梯图怎么看?2026最新cpu性能排行

    2026年服务器CPU性能排名中,Intel Xeon 6系列与AMD EPYC 9004/9005系列占据绝对主导地位,具体选型需根据虚拟化密度、数据库负载及预算规模进行精准匹配,而非单纯追求最高跑分,在数据中心和云计算基础设施的建设中,处理器不仅是算力的核心,更是决定整体架构效率的关键变量,随着AI大模型推……

    2026年7月3日
    8500

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注