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

C# StreamWriter 写入字节数组两种方案

C# StreamWriter 写入字节数组两种方案

先分清核心概念:
StreamWriter字符写入器,只负责字符串/字符;它本身没有直接写入 byte[] 的方法
字节数组属于二进制数据,有两种实现思路:

  1. 先把 byte[] 转字符串,再用 StreamWriter 写入(字节当文本)
  2. 拿到底层 FileStream,直接 Write 字节数组(推荐,原生写二进制)

一、方式1:byte[] → 字符串 → StreamWriter写入(字节作为文本保存)

适用场景:字节是文本编码后的内容,需要以文本形式存到txt。
原理:用对应编码把 byte[] 解码成 string,再 Write/WriteLine。

using System;
using System.IO;
using System.Text;class Program
{static void Main(){// 原始字节数组(UTF8编码的中文)byte[] buffer = Encoding.UTF8.GetBytes("测试字节数组文本");string path = "byteToStr.txt";Encoding utf8NoBom = new UTF8Encoding(false);using (StreamWriter sw = new StreamWriter(path, false, utf8NoBom)){// 字节数组解码为字符串string text = utf8NoBom.GetString(buffer);sw.WriteLine(text);}}
}

二、方式2:获取底层流,直接写入byte[](真正写二进制字节,推荐)

StreamWriter.BaseStream 获取内部的 FileStream,FileStream 原生支持 Write(byte[], offset, count),可以直接写入字节数组,不走字符转换。

using System;
using System.IO;
using System.Text;static void WriteBytesByStreamWriter()
{string path = "writeBytes.txt";byte[] data = { 0x31, 0x32, 0x33, 0xE4, 0xB8, 0xAD }; // "123中" 的UTF8字节using (StreamWriter sw = new StreamWriter(path, false, Encoding.UTF8)){// 获取底层文件流Stream fs = sw.BaseStream;// 写入字节数组:数组、起始偏移、写入长度fs.Write(data, 0, data.Length);// 强制刷新缓冲区,确保数据落盘fs.Flush();}
}

追加模式写入字节

byte[] appendData = Encoding.UTF8.GetBytes("\r\n追加的字节内容");
using (StreamWriter sw = new StreamWriter("writeBytes.txt", true, Encoding.UTF8))
{sw.BaseStream.Write(appendData, 0, appendData.Length);sw.BaseStream.Flush();
}

三、异步写入字节数组(BaseStream异步)

static async Task WriteBytesAsync()
{string path = "asyncBytes.txt";byte[] bytes = Encoding.UTF8.GetBytes("异步写入字节");using (StreamWriter sw = new StreamWriter(path, false, Encoding.UTF8)){await sw.BaseStream.WriteAsync(bytes, 0, bytes.Length);await sw.BaseStream.FlushAsync();}
}

四、重要注意事项

  1. StreamWriter 缓冲冲突
    StreamWriter 自带字符缓冲区,如果你混用 sw.WriteLine()BaseStream.Write(),字符缓冲会优先写入,字节会出现在文字前面/错乱。
    混用前必须先调用 sw.Flush() 清空字符缓冲区:

    using (StreamWriter sw = new StreamWriter("test.txt", false))
    {sw.WriteLine("文字内容");sw.Flush(); // 先把文字刷进流byte[] b = {0x30};sw.BaseStream.Write(b,0,b.Length);
    }
    
  2. 不要混淆两种用途

    • 想把字节当成可读文本:用 Encoding.GetString(byte[]) 转字符串再Write
    • 想原样保存二进制字节(文件、加密数据等):直接操作 BaseStream
  3. 编码统一
    通过 BaseStream 写字节时,字节本身是什么编码,文件就是什么编码,不受 StreamWriter 构造函数编码参数影响;
    只有调用 sw.Write(string) 时,才会使用构造传入的编码转字节。

最简封装方法

/// <summary>通过StreamWriter底层流写入字节数组</summary>
static void WriteBytes(StreamWriter sw, byte[] buffer)
{if (buffer == null || buffer.Length == 0) return;sw.BaseStream.Write(buffer, 0, buffer.Length);sw.BaseStream.Flush();
}

调用示例:

byte[] buf = Encoding.UTF8.GetBytes("封装测试");
using var sw = new StreamWriter("demo.txt", false, new UTF8Encoding(false));
WriteBytes(sw, buf);
http://www.gsyq.cn/news/1556338.html

相关文章:

  • 2026 唐山防水补漏靠谱服务商盘点:屋面 / 厨卫 / 外墙 / 地下室渗水维修详解,适配冀东滨海大风冻融防水甄选指南 - 宅安选房屋修缮
  • PHP反序列化字符串逃逸漏洞:原理、利用与实战审计
  • PHP国产化数据库(达梦、人大金仓、OceanBase)对接与调优体系.
  • 端午正常访校|27届成都首创锦榜单招端午3天全天接待,假期可预约看校 - 成都单招培训
  • 2026年选GEO优化公司,这3家专业度更胜一筹 - 速递信息
  • 深入解析MC9RS08KA2:低成本8位MCU架构、内存管理与低功耗设计实战
  • 深耕杭城防水领域 匠心守护安居|微顺虹防水:初心筑品质,服务护万家 - 徽顺虹
  • Android 14/15 Root终极解决方案:Magisk完整安装与高级配置指南
  • MPC5554电气特性与接口时序深度解析:从数据手册到可靠硬件设计
  • 6,9
  • 深入解析BDLC控制器:J1850总线非破坏性仲裁机制与汽车电子通信实践
  • SuperCom串口调试工具:如何用一款工具解决嵌入式开发中的5大串口调试痛点?
  • 深入解析MC9S12XE Flash安全访问与内存管理实战指南
  • AI Agent 的记忆系统:短期记忆、长期记忆与工作记忆
  • Go学习第11天:包管理 + VSCode开发
  • 普宁实木家具推荐|原木胡桃木哪家风格齐 - 品牌观察
  • 【2026年6月】浮筒式潜水泵厂家推荐 - 多才菠萝
  • MC9S08DN60低功耗与CAN总线设计:嵌入式经典MCU实战解析
  • 深耕鹏城防水领域 匠心守护安居|微顺虹防水:初心筑品质,服务护万家 - 徽顺虹
  • GEO优化能不能抢占竞品搜索流量
  • 【大模型上下文长度扩展】YaRN:动态插值,解锁超长文本理解新范式
  • Grok4如何重塑人类工作坐标:从知识执行到问题架构
  • 2026 年了,AI 做 PPT 到底哪家强?测了 8 款 AI 做 PPT 工具后,我决定把备份方案全删了 - 速递信息
  • 鸿蒙物理 108 篇 第二篇 有无相生物理显隐底层定则
  • Windows系统文件paqsp.dll丢失找不到问题解决
  • 2026厦门黄金回收去哪好|本地正规排名出炉,靠谱品牌推荐 - 奢侈品回收评测
  • 嘉兴仿真植物造景布置怎么选?2026仿真植物布置软装市场现状与服务商选型报告 - 三棵树园艺
  • 实战拆解:GEO优化文章结构的4个关键差异——从传统SEO到AI引用的转型路径
  • Python学习第93天:MySQL性能优化
  • 汽车级PMIC失效安全与看门狗设计:以NXP MC33907/33908为例