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. 处理异常:文件操作可能因权限、路径不存在等原因失败,应捕获 IOExceptionUnauthorizedAccessException 等异常。
  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://idctop.com/article/485367.html

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

相关推荐

  • 生信AI大模型怎么用?生信分析常用工具推荐

    生信AI大模型通过整合多组学数据与深度学习算法,显著提升了基因组变异检测、蛋白质结构预测及药物发现的效率与精度,已成为生物信息学研究的核心基础设施,生信AI大模型如何重塑科研工作流传统的生物信息学分析往往依赖繁琐的手工代码和单一工具链,研究人员需要花费大量时间处理数据清洗、格式转换和参数调优,这种低效模式在面临……

    2026年6月14日
    4800
  • 服务器托管业务靠谱吗?服务器托管费用怎么计算

    服务器托管业务的核心价值在于通过租用专业IDC机房资源,以低于自建机房的成本获得电信级的高可用性、带宽保障及安全防护,是企业实现IT基础设施轻量化运营的最佳选择,为什么企业选择服务器托管而非自建机房?对于大多数成长型企业和互联网初创公司而言,自建机房往往是一个“看起来很美”的陷阱,想象一下,你需要独自承担机房选……

    2026年7月3日
    400
  • 负载均衡加权怎么配置?负载均衡加权算法有哪些

    负载均衡加权的核心在于根据服务器性能动态分配流量,通过权重值控制请求比例,从而避免单点过载并提升整体系统稳定性,在构建高可用架构时,单纯依靠轮询或IP哈希往往无法应对复杂的业务场景,加权算法就像一位经验丰富的交通指挥官,它不盲目地让每辆车(请求)平均通过路口,而是根据每条道路的通行能力(服务器性能)来疏导车流……

    2026年7月1日
    1510
  • 常见AI大模型有哪些?国内主流AI大模型排行榜

    2026年主流AI大模型已形成“通用全能型”与“垂直专家型”双轨并行的格局,选择时需根据具体业务场景、预算规模及对数据隐私的要求进行匹配,人工智能技术在过去两年经历了从“能聊”到“能办”的质变,现在的模型不再仅仅是文字生成工具,而是具备逻辑推理、代码执行和多模态理解的智能体,对于企业用户和个人创作者而言,面对琳……

    2026年6月13日
    4700
  • 服务器跑深度学习时如何上传数据?深度学习数据上传方法

    将本地数据上传至远程深度学习服务器,最高效且稳定的方案是使用支持断点续传的命令行工具(如rsync或scp),配合SSH密钥认证实现自动化传输,避免GUI工具在大数据量下的卡顿与中断风险,在人工智能开发领域,算力即生产力,当你拥有了一块强大的GPU服务器,却受限于本地硬盘的读写速度和网络带宽时,数据搬运就成了最……

    2026年7月10日
    16000
  • 大模型蒸馏学生模型怎么选?大模型蒸馏学生模型选型指南

    选择学生模型的核心在于平衡推理性能与部署成本,优先选用参数量在7B至13B之间、经过指令微调且具备多模态能力的开源模型,如Qwen2.5或Llama-3系列,并依据具体业务场景进行二次蒸馏优化,大模型蒸馏并非简单的“复制粘贴”,而是一场关于算力、精度与效率的精密博弈,许多开发者在初期往往陷入盲目追求小参数的误区……

    2026年6月22日
    1910
  • 手机谷歌ai大模型怎么用?谷歌ai大模型怎么下载

    手机谷歌AI大模型并非单一APP,而是集成在Google Assistant、Pixel手机及各类安卓应用中的底层智能引擎,其核心优势在于深度整合Gmail、地图、相册等原生服务,提供跨应用的上下文理解与自动化操作能力,手机谷歌AI大模型的核心技术架构解析多模态理解能力的突破早期的手机语音助手往往只能识别简单的……

    2026年6月13日
    2600
  • 服务器客户端时钟不同步怎么解决?windows服务器时间同步设置

    服务器与客户端时钟不同步会导致数据错乱、认证失败及日志混乱,解决核心在于部署NTP协议并配置可信时间源,确保毫秒级同步精度,在分布式系统和互联网应用中,时间不仅仅是墙上的数字,它是所有逻辑判断的基石,想象一下,如果银行转账的时间戳比实际发生时间晚了10秒,或者日志记录的时间早于操作发生时间,整个系统的数据一致性……

    2026年7月7日
    9900
  • 服务器哪家比较稳定?国内服务器租用哪家性价比高

    业内公认最稳定的服务器品牌是阿里云、腾讯云和华为云,其中阿里云在电商和高并发场景表现最佳,腾讯云在游戏和社交领域优势明显,华为云则在政企混合云部署中最为可靠,如何选择最稳定的云服务器品牌在选择云服务器时,稳定性是首要考量因素,许多用户会问“国内哪家云服务器最稳定”,这其实没有唯一答案,因为不同厂商的技术栈和优势……

    2026年7月6日
    7300
  • Filezilla客户端和服务器端怎么用?Filezilla配置教程

    FileZilla客户端与服务器端的核心区别在于:客户端用于用户本地连接和管理文件,而服务器端用于在主机上开放端口并授权用户访问,二者配合才能实现安全的远程文件传输,很多刚接触网站运维的朋友容易混淆这两者,以为下载一个FileZilla就能搞定所有事情,这就像快递一样,客户端是你手里的手机APP,用来下单和查看……

    2026年7月3日
    3210

发表回复

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