当前位置: 首页 > news >正文

C#StreamWriter 与 File.AppendAllText 写入文本核心区别

C# StreamWriter 与 File.AppendAllText 写入文本核心区别

一、底层本质

1. File.AppendAllText

File.AppendAllText("test.txt", "内容");
  • 静态工具方法,一次性封装全套逻辑
  • 内部流程:
    1. 判断文件是否存在
    2. 创建/打开文件流 FileStream
    3. 实例化 StreamWriter
    4. Write写入
    5. 立刻自动释放所有资源(using 内部封装)
    6. 关闭文件流
  • 源码本质:单次临时创建并销毁 StreamWriter

2. StreamWriter

// 追加模式打开
using var sw = new StreamWriter("test.txt", append: true);
sw.WriteLine("内容");
// 多次写入...
sw.Flush();
  • 流写入类,长生命周期、可复用
  • 需要手动用 using 释放资源,否则文件句柄占用
  • 支持持续多次写入,文件只打开一次

二、核心差异对比表

对比维度 File.AppendAllText StreamWriter(append=true)
文件打开次数 每次调用都重新打开+关闭文件 实例化一次,全程只打开一次
性能(少量写入) 简单代码,差距不大 略优
性能(循环大量写入) 极差,反复创建销毁流,频繁IO 性能极高,一次打开循环写
资源释放 自动释放,无需using 必须using/Dispose,否则锁文件
缓冲区控制 内部自动Flush,无法自定义缓冲 可手动Flush、自定义缓冲区大小
编码设置 重载可指定编码,默认UTF-8带BOM 构造函数自由指定编码
支持逐行/分段 只能一次性传入完整字符串 Write/WriteLine/WriteAsync 灵活分段写
异步版本 File.AppendAllTextAsync WriteAsyncFlushAsync 细粒度异步
文件占用 每次调用瞬间占用后释放 对象存活期间持续持有文件句柄
适用场景 单次少量追加,一行/短句写入 循环批量、大文本、持续分段写入

三、关键细节差异

1. IO 开销(最重要)

场景:循环1万次追加文本

  • File.AppendAllText
    每次打开磁盘文件、创建流、写入、关闭句柄,磁盘频繁读写、系统调用开销巨大,速度慢几十上百倍
  • StreamWriter
    文件仅打开1次,全部写入完成后才关闭,内存缓冲区批量刷盘,IO次数极少。

2. 文件锁与占用

  • File.AppendAllText:方法执行完立刻释放文件,其他程序可随时读写。
  • StreamWriter:只要对象没Dispose,文件会被进程独占,其他程序无法修改/删除该txt。

3. 缓冲区机制

StreamWriter 内置字符缓冲区,默认几千字符:

// 自定义4096字节缓冲区
using var sw = new StreamWriter("test.txt", true, Encoding.UTF8, 4096);
  • 不调用 Flush() 时,数据先存在内存,满了才自动写入磁盘;
  • File.AppendAllText 每次写完强制刷新缓冲区到磁盘。

4. 编码行为

两者都可自定义编码,默认规则一致:

  • 无编码参数:UTF-8(带BOM)
File.AppendAllText("a.txt", "123", Encoding.UTF8);new StreamWriter("a.txt", true, Encoding.UTF8);

5. 异步写法区别

  1. File.AppendAllTextAsync:一次性异步写入整块文本
await File.AppendAllTextAsync("test.txt", "文本");
  1. StreamWriter 细粒度异步,适合流式输出:
using var sw = new StreamWriter("test.txt", true);
await sw.WriteLineAsync("第一行");
await sw.WriteLineAsync("第二行");
await sw.FlushAsync();

四、使用场景推荐

用 File.AppendAllText

  1. 单次、少量追加文本(日志单条记录、简单标记写入)
  2. 代码极简,不想手动管理流、using、释放资源
  3. 写完立刻释放文件,需要其他程序马上读取该文件

用 StreamWriter

  1. 循环批量写入(循环导出数据、持续写日志)
  2. 大文件、多行分段输出,需要多次Write
  3. 需要手动控制缓冲区、异步逐行写入
  4. 追求高性能,减少磁盘打开关闭次数

五、踩坑示例

坑1:循环调用AppendAllText性能灾难

// 不推荐!万次循环极慢
for(int i=0;i<10000;i++)
{File.AppendAllText("log.txt", $"日志{i}\r\n");
}

优化方案改用StreamWriter:

using var sw = new StreamWriter("log.txt", true);
for(int i=0;i<10000;i++)
{sw.WriteLine($"日志{i}");
}
sw.Flush();

坑2:忘记释放StreamWriter导致文件占用

// 错误:无using,文件一直被占用
StreamWriter sw = new StreamWriter("test.txt", true);
sw.WriteLine("xxx");
// 未Dispose,外部无法删除文件// 正确
using var sw = new StreamWriter("test.txt", true);

六、简单总结

  1. 单次少量写入:选 File.AppendAllText,代码简洁省心;
  2. 多次循环/大批量写入:选 StreamWriter,性能碾压前者;
  3. 底层关系:File.AppendAllTextStreamWriter 的一次性封装快捷方法。
http://www.jsqmd.com/news/1044336/

相关文章:

  • 懂游宝(懂淘app)新品牌逆势增长,276家品牌年销破亿
  • 从拿破仑到希特勒:复盘“寒冬”如何成为战争史上的决定性变量
  • 武汉叛逆厌学戒网瘾学校十大排名(央视推荐家长必看) - 辛云教育资讯
  • 测试必学:推荐4个测试用例设计最值得掌握的Agent Skill,几乎覆盖所有用例设计场景!
  • 普宁家居推荐|本地家居店哪家口碑好售后稳 - 品牌观察
  • go:Producer Consumer Pattern
  • 普宁哪家家具又好又便宜|质量过硬价格透明哪家店 - 品牌观察
  • AWS 删除用户的权限会发生什么
  • 高温冶炼车间炉前工位工业平板采购方案,避开高温死机故障
  • 普宁家具店推荐|展厅大款式新去哪家逛 - 品牌观察
  • 【电赛/毕设降维打击】别让 STM32 跑视觉了!树莓派/香橙派 Linux 边缘计算、NPU 加速与双核异构架构硬核避坑指南前言
  • 3步打造专业级Vue日历应用:dayspan-vuetify完整指南
  • 寄快递省钱攻略:2026快递品牌性价比与折扣全对比 - 快递物流资讯
  • 2026 泰州防水补漏靠谱服务商盘点:屋面 / 厨卫 / 外墙 / 地下室渗水维修详解,适配苏中滨江梅雨低洼防水甄选指南 - 宅安选房屋修缮
  • 学习总结8
  • 广东省佛山市南海区吃川菜推荐去哪家?实测 4 家正宗川味馆子 - 速递信息
  • 批量合成视频工具 批量剪辑视频神器免费版 一键生成 青柠剪吧助手全能版
  • MC68060 JTAG边界扫描技术详解:从原理到硬件调试实战
  • MC9S12XE Flash模块深度解析:内存映射、寄存器配置与安全机制实战
  • 计算机教材策划与写作:如何将AI与云计算前沿知识结构化
  • 终极指南:使用OpenCore Legacy Patcher免费升级老旧Mac到最新macOS系统
  • 无锡仿真植物造景布置怎么选?2026软装市场现状与服务商选型报告 - 三棵树园艺
  • 别再盲目手写论文!这7款AI工具一键生成,全学科秒出稿! - 麟书学长
  • 2026 芜湖防水补漏靠谱服务商盘点:屋面 / 厨卫 / 外墙 / 地下室渗水维修详解,适配皖南滨江梅雨潮湿防水甄选指南 - 宅安选房屋修缮
  • 学习总结9
  • Elsevier Tracker:告别投稿焦虑,3分钟实现学术审稿状态实时可视化
  • MC9S08JM60 ADC误差分析与IIC协议精解:提升嵌入式测量与通信稳定性
  • 如何快速构建抖音直播数据采集系统:完整实战指南
  • GPT-4.1是假消息?揭穿大模型命名乱象与Turbo真实能力
  • 端午不打烊!27 届成都锦城菁英单招校区正常开放,可预约全天访校 - 成都单招培训